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

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

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

        PR c++/60376
        * testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc:
        Adjust dg-error directives.
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 }

Reply via email to