diff mbox

[C++] PR 60376

Message ID 531451D7.60509@oracle.com
State New
Headers show

Commit Message

Paolo Carlini March 3, 2014, 9:56 a.m. UTC
Hi,

in this -std=c++1y regression we ICE on invalid code during error recovery:

60376.C: In function ‘void bar()’:
60376.C:8:9: error: expected nested-name-specifier before ‘(’ token
using (A().foo);
^
60376.C:8:9: error: expected unqualified-id before ‘(’ token
60376.C:8:9: error: expected ‘;’ before ‘(’ token
60376.C:8:18: error: statement cannot resolve address of overloaded function
using (A().foo);
^
60376.C:8:9: internal compiler error: ...

I think we can take the occasion to handle the issue early, in the 
parser, thus cleaning up the diagnostic we emit in such cases, that is, 
emit only the first error message (to achieve that I used the same 
approach already used elsewhere: detect the hard error condition and 
skip). Tested x86_64-linux.

Thanks,
Paolo.

PS: Submitter posted also an ICE on valid issue, which seems separate to me.

/////////////////////
/gcc/cp
2014-03-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60376
	* parser.c (cp_parser_using_declaration): Early return when
	cp_parser_nested_name_specifier errors out.

/gcc/testsuite
2014-03-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60376
	* g++.dg/cpp1y/pr60376.C: New.

/libstdc++-v3
2014-03-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60376
	* testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc:
	Adjust dg-error directives.

Comments

Jason Merrill March 3, 2014, 7:40 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c	(revision 208269)
+++ gcc/cp/parser.c	(working copy)
@@ -15932,10 +15932,17 @@  cp_parser_using_declaration (cp_parser* parser,
   /* If we saw `typename', or didn't see `::', then there must be a
      nested-name-specifier present.  */
   if (typename_p || !global_scope_p)
-    qscope = cp_parser_nested_name_specifier (parser, typename_p,
-					      /*check_dependency_p=*/true,
-					      /*type_p=*/false,
-					      /*is_declaration=*/true);
+    {
+      qscope = cp_parser_nested_name_specifier (parser, typename_p,
+						/*check_dependency_p=*/true,
+						/*type_p=*/false,
+						/*is_declaration=*/true);
+      if (!qscope && !cp_parser_uncommitted_to_tentative_parse_p (parser))
+	{
+	  cp_parser_skip_to_end_of_block_or_statement (parser);
+	  return false;
+	}
+    }
   /* Otherwise, we could be in either of the two productions.  In that
      case, treat the nested-name-specifier as optional.  */
   else
Index: gcc/testsuite/g++.dg/cpp1y/pr60376.C
===================================================================
--- gcc/testsuite/g++.dg/cpp1y/pr60376.C	(revision 0)
+++ gcc/testsuite/g++.dg/cpp1y/pr60376.C	(working copy)
@@ -0,0 +1,12 @@ 
+// PR c++/60376
+// { dg-options -std=c++1y }
+
+struct A
+{
+  int foo();
+};
+
+template<typename> void bar()
+{
+  using (A().foo);  // { dg-error "expected" }
+}
Index: libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc
===================================================================
--- libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc	(revision 208269)
+++ libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc	(working copy)
@@ -121,50 +121,3 @@  void test01()
 // { dg-error "expected nested-name-specifier" "" { target *-*-* } 72 }
 // { dg-error "expected nested-name-specifier" "" { target *-*-* } 73 }
 // { dg-error "expected nested-name-specifier" "" { target *-*-* } 75 }
-
-// { dg-error "declared" "" { target *-*-* } 26 }
-// { dg-error "declared" "" { target *-*-* } 27 }
-// { dg-error "declared" "" { target *-*-* } 28 }
-// { dg-error "declared" "" { target *-*-* } 29 }
-// { dg-error "declared" "" { target *-*-* } 30 }
-// { dg-error "declared" "" { target *-*-* } 31 }
-// { dg-error "declared" "" { target *-*-* } 32 }
-// { dg-error "declared" "" { target *-*-* } 34 }
-// { dg-error "declared" "" { target *-*-* } 36 }
-// { dg-error "declared" "" { target *-*-* } 37 }
-// { dg-error "declared" "" { target *-*-* } 38 }
-// { dg-error "declared" "" { target *-*-* } 39 }
-// { dg-error "declared" "" { target *-*-* } 40 }
-// { dg-error "declared" "" { target *-*-* } 41 }
-// { dg-error "declared" "" { target *-*-* } 42 }
-// { dg-error "declared" "" { target *-*-* } 43 }
-// { dg-error "declared" "" { target *-*-* } 44 }
-// { dg-error "declared" "" { target *-*-* } 45 }
-// { dg-error "declared" "" { target *-*-* } 46 }
-// { dg-error "declared" "" { target *-*-* } 47 }
-// { dg-error "declared" "" { target *-*-* } 48 }
-// { dg-error "declared" "" { target *-*-* } 49 }
-// { dg-error "declared" "" { target *-*-* } 50 }
-// { dg-error "declared" "" { target *-*-* } 52 }
-// { dg-error "declared" "" { target *-*-* } 53 }
-// { dg-error "declared" "" { target *-*-* } 54 }
-// { dg-error "declared" "" { target *-*-* } 55 }
-// { dg-error "declared" "" { target *-*-* } 56 }
-// { dg-error "declared" "" { target *-*-* } 57 }
-// { dg-error "declared" "" { target *-*-* } 58 }
-// { dg-error "declared" "" { target *-*-* } 59 }
-// { dg-error "declared" "" { target *-*-* } 60 }
-// { dg-error "declared" "" { target *-*-* } 61 }
-// { dg-error "declared" "" { target *-*-* } 62 }
-// { dg-error "declared" "" { target *-*-* } 63 }
-// { dg-error "declared" "" { target *-*-* } 64 }
-// { dg-error "declared" "" { target *-*-* } 65 }
-// { dg-error "declared" "" { target *-*-* } 66 }
-// { dg-error "declared" "" { target *-*-* } 67 }
-// { dg-error "declared" "" { target *-*-* } 68 }
-// { dg-error "declared" "" { target *-*-* } 69 }
-// { dg-error "declared" "" { target *-*-* } 70 }
-// { dg-error "declared" "" { target *-*-* } 71 }
-// { dg-error "declared" "" { target *-*-* } 72 }
-// { dg-error "declared" "" { target *-*-* } 73 }
-// { dg-error "declared" "" { target *-*-* } 75 }