From 4ac56fde83c3d304f1dabe96946e25f422e374f7 Mon Sep 17 00:00:00 2001 From: paolo Date: Tue, 8 Nov 2011 10:23:53 +0000 Subject: [PATCH] /cp 2011-11-08 Paolo Carlini PR c++/50864 * parser.c (cp_parser_postfix_dot_deref_expression): Reject invalid uses of '->' and '.' as postfix-expression in namespace scope. /testsuite 2011-11-08 Paolo Carlini PR c++/50864 * g++.dg/parse/template26.C: New. * g++.dg/template/crash45.C: Adjust dg-error string. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181151 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 15 +++++++++++---- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/parse/template26.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/template/crash45.C | 2 +- 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/template26.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 98e0fe3..5a492e9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-11-08 Paolo Carlini + + PR c++/50864 + * parser.c (cp_parser_postfix_dot_deref_expression): Reject invalid + uses of '->' and '.' as postfix-expression in namespace scope. + 2011-11-07 Jason Merrill PR c++/50848 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 697be80..7d04971 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5969,10 +5969,17 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, { if (name != error_mark_node && !BASELINK_P (name) && parser->scope) { - name = build_qualified_name (/*type=*/NULL_TREE, - parser->scope, - name, - template_p); + if (TREE_CODE (parser->scope) == NAMESPACE_DECL) + { + error_at (token->location, "%<%D::%D%> is not a class member", + parser->scope, name); + postfix_expression = error_mark_node; + } + else + name = build_qualified_name (/*type=*/NULL_TREE, + parser->scope, + name, + template_p); parser->scope = NULL_TREE; parser->qualifying_scope = NULL_TREE; parser->object_scope = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 875e099..12ad3d4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-11-08 Paolo Carlini + + PR c++/50864 + * g++.dg/parse/template26.C: New. + * g++.dg/template/crash45.C: Adjust dg-error string. + 2011-11-07 Jason Merrill PR c++/50848 diff --git a/gcc/testsuite/g++.dg/parse/template26.C b/gcc/testsuite/g++.dg/parse/template26.C new file mode 100644 index 0000000..aab9763 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template26.C @@ -0,0 +1,18 @@ +// PR c++/50864 + +namespace impl +{ + template T create(); +} + +template ()->*impl::create())> +struct foo1; + +template ()->impl::create())> // { dg-error "not a class member" } +struct foo2; + +template ().impl::create())> // { dg-error "not a class member" } +struct foo3; diff --git a/gcc/testsuite/g++.dg/template/crash45.C b/gcc/testsuite/g++.dg/template/crash45.C index f138e3d..f67fd02 100644 --- a/gcc/testsuite/g++.dg/template/crash45.C +++ b/gcc/testsuite/g++.dg/template/crash45.C @@ -9,5 +9,5 @@ namespace N void bar(A *p) { - p->N::foo<0>; // { dg-error "not a member" } + p->N::foo<0>; // { dg-error "not a class member" } } -- 2.7.4