Patchwork [C++] PR 50864 (parser bits)

login
register
mail settings
Submitter Paolo Carlini
Date Nov. 8, 2011, 1:21 a.m.
Message ID <4EB8842A.2040603@oracle.com>
Download mbox | patch
Permalink /patch/124233/
State New
Headers show

Comments

Paolo Carlini - Nov. 8, 2011, 1:21 a.m.
On 11/08/2011 01:51 AM, Paolo Carlini wrote:
>> Do we need to check the code of postfix_expression at all?
> Ah! You implied that, in your previous message, but seemed too nice to 
> me ;) Let me regtest without...
And this indeed passes testing. A rather old testcase got a slightly 
more accurate error message.

Thanks,
Paolo.

//////////////////////
/cp
2011-11-08  Paolo Carlini  <paolo.carlini@oracle.com>

	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  <paolo.carlini@oracle.com>

	PR c++/50864
	* g++.dg/parse/template26.C: New.
	* g++.dg/template/crash45.C: Adjust dg-error string.
Jason Merrill - Nov. 8, 2011, 4:05 a.m.
OK.

Jason

Patch

Index: testsuite/g++.dg/parse/template26.C
===================================================================
--- testsuite/g++.dg/parse/template26.C	(revision 0)
+++ testsuite/g++.dg/parse/template26.C	(revision 0)
@@ -0,0 +1,18 @@ 
+// PR c++/50864
+
+namespace impl
+{
+  template <class T> T create();
+}
+
+template <class T, class U, __SIZE_TYPE__
+	  = sizeof(impl::create<T>()->*impl::create<U>())>
+struct foo1;
+
+template <class T, class U, __SIZE_TYPE__
+	  = sizeof(impl::create<T>()->impl::create<U>())> // { dg-error "not a class member" }
+struct foo2;
+
+template <class T, class U, __SIZE_TYPE__
+	  = sizeof(impl::create<T>().impl::create<U>())> // { dg-error "not a class member" }
+struct foo3;
Index: testsuite/g++.dg/template/crash45.C
===================================================================
--- testsuite/g++.dg/template/crash45.C	(revision 181138)
+++ testsuite/g++.dg/template/crash45.C	(working copy)
@@ -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" }
 }
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 181138)
+++ cp/parser.c	(working copy)
@@ -5969,10 +5969,17 @@  cp_parser_postfix_dot_deref_expression (cp_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;