re PR c++/16128 (Diagnostic of missing argument list within functions)
authorPaolo Carlini <paolo@gcc.gnu.org>
Mon, 17 Jun 2013 14:06:36 +0000 (14:06 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 17 Jun 2013 14:06:36 +0000 (14:06 +0000)
/cp
2013-06-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/16128
* parser.c (cp_parser_expression_statement): Check whether
cp_parser_expression returns error_mark_node.

/testsuite
2013-06-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/16128
* g++.dg/template/error52.C: New.
* g++.dg/lookup/friend15.C: Update.
* g++.dg/parse/error11.C: Likewise.
* g++.dg/parse/error14.C: Likewise.
* g++.dg/parse/parser-pr28152-2.C: Likewise.
* g++.dg/parse/template25.C: Likewise.
* g++.old-deja/g++.jason/cond.C: Likewise.
* g++.old-deja/g++.mike/for2.C: Likewise.
* g++.old-deja/g++.robertl/eb125.C: Likewise.
* obj-c++.dg/property/dotsyntax-4.mm: Likewise.

From-SVN: r200150

14 files changed:
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/friend15.C
gcc/testsuite/g++.dg/parse/error11.C
gcc/testsuite/g++.dg/parse/error14.C
gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
gcc/testsuite/g++.dg/parse/parser-pr28152.C
gcc/testsuite/g++.dg/parse/template25.C
gcc/testsuite/g++.dg/template/error52.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.jason/cond.C
gcc/testsuite/g++.old-deja/g++.mike/for2.C
gcc/testsuite/g++.old-deja/g++.robertl/eb125.C
gcc/testsuite/obj-c++.dg/property/dotsyntax-4.mm

index 1ffeed336195fa1ae1fe26cd7c4042139e112644..b6caf702b3b351b2bc9bfc242b499b0f615c4bf0 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/16128
+       * parser.c (cp_parser_expression_statement): Check whether
+       cp_parser_expression returns error_mark_node.
+
 2013-06-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51413
index a581e88e44b9543c6c14a0aece90fc6b57ade1e0..d844d1553a024a8beffd15505bc3b8196f59687b 100644 (file)
@@ -9264,7 +9264,15 @@ cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
   /* If the next token is a ';', then there is no expression
      statement.  */
   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
-    statement = cp_parser_expression (parser, /*cast_p=*/false, NULL);
+    {
+      statement = cp_parser_expression (parser, /*cast_p=*/false, NULL);
+      if (statement == error_mark_node
+         && !cp_parser_uncommitted_to_tentative_parse_p (parser))
+       {
+         cp_parser_skip_to_end_of_block_or_statement (parser);
+         return error_mark_node;
+       }
+    }
 
   /* Give a helpful message for "A<T>::type t;" and the like.  */
   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
index 0d6f4987dbb7ffe9734fce28a7dd9176aee2468b..147ae19e61b88f659ddc56fd61aa73414583e629 100644 (file)
@@ -1,3 +1,17 @@
+2013-06-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/16128
+       * g++.dg/template/error52.C: New.
+       * g++.dg/lookup/friend15.C: Update.
+       * g++.dg/parse/error11.C: Likewise.
+       * g++.dg/parse/error14.C: Likewise.
+       * g++.dg/parse/parser-pr28152-2.C: Likewise.
+       * g++.dg/parse/template25.C: Likewise.
+       * g++.old-deja/g++.jason/cond.C: Likewise.
+       * g++.old-deja/g++.mike/for2.C: Likewise.
+       * g++.old-deja/g++.robertl/eb125.C: Likewise.
+       * obj-c++.dg/property/dotsyntax-4.mm: Likewise.
+
 2013-06-17  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/arm/unaligned-memcpy-2.c (dest): Initialize to
@@ -5,7 +19,7 @@
 
 2013-06-16  Balaji V. Iyer  <balaji.v.iyer@intel.com>
 
-       * c-c++-common/cilk-plus/AN/if_test.c (main2): Fixed a bug of 
+       * c-c++-common/cilk-plus/AN/if_test.c (main2): Fixed a bug of
        accidentally placing minus sign for length instead of stride.
 
 2013-06-16  Joern Rennecke <joern.rennecke@embecosm.com>
index 1e271fc3f00663e6a5291172596daea7f33da51b..e05cc555707ee6eb9dec5a6bfe319f4c790566ff 100644 (file)
@@ -8,5 +8,4 @@ void foo()
     friend class B;
   };
   B::B() {} // { dg-error "has not been declared" }
-// { dg-error "expected" "expected" { target *-*-* } 10 }
 }
index ec0058ee767886b36a56ed1243ca268f6e69f981..6e42ed89afa226bfa93b7ac2070d58d2aceb92a9 100644 (file)
@@ -53,18 +53,16 @@ void func(void)
 // { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } }
 // { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 }
 // { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 }
-// { dg-error "9:expected ';' before ':' token" "semicolon" { target *-*-* } 51 }
 // { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 }
 // { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 }
 // { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 }
-// { dg-error "7:expected ';' before ':' token" "semicolon" { target *-*-* } 52 }
 //
   int Foo[2];
   Foo[::value] = 0;
 }
 
 template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" { target c++98 } }
-// { dg-message "20:is an alternate" "alt" { target c++98 } 66 }
+// { dg-message "20:is an alternate" "alt" { target c++98 } 64 }
 
 // On the first error message, an additional note about the use of 
 //  -fpermissive should be present
index 04f2f56b6dc6d611fb377fa70a17a20623dac3c3..37a3d2001ffb2796f8bb3ff645e130b02db5f1a7 100644 (file)
@@ -22,5 +22,3 @@ struct X
 }; // { dg-error "2:expected '.' at end of input" "at end of input" }
    // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 }
    // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 }
-   // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 }
-
index a5bbb9288c5483b93e6677ad56b6c6120984d508..c6bc5d39bf30a64c8b0e00938e119280bd3f6763 100644 (file)
@@ -7,7 +7,5 @@ main (void)
   __complex__ float z;
 
   z = __complex__ (1.90000007326203904e+19, 0.0);   // { dg-error "expected primary-expression before '__complex__'" "primary-expression" } 
-  // { dg-error "expected .;. before .__complex__." "semicolon" { target *-*-* } 9 } 
   z = __complex__ (1.0e+0, 0.0) / z;    // { dg-error "expected primary-expression before '__complex__'" "primaty-expression" } 
-  // { dg-error "expected .;. before '__complex__'" "semicolon" { target *-*-* } 11 } 
-  // { dg-error "at end of input" "end" { target *-*-* } 11 } 
+  // { dg-error "at end of input" "end" { target *-*-* } 10 }
index 4a7c77e45ac32b511162ecee4645aa166df8b176..4d08fd0633fb096bdffb7a2731e9a5caccf17344 100644 (file)
@@ -7,7 +7,5 @@ main (void)
   _Complex float z;
 
   z = _Complex (1.90000007326203904e+19, 0.0);   // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } 
-  // { dg-error "expected .;. before ._Complex." "semicolon" { target *-*-* } 9 } 
   z = _Complex (1.0e+0, 0.0) / z;    // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } 
-  // { dg-error "expected .;. before '_Complex'" "semicolon" { target *-*-* } 11 } 
-  // { dg-error "at end of input" "end" { target *-*-* } 11 } 
+  // { dg-error "at end of input" "end" { target *-*-* } 10 }
index 0da3887c3a4aefee22552d6f5f7c0026d63506da..03017ab3a636cc7f0a575eb76a0c7ea9bcf47ac2 100644 (file)
@@ -10,5 +10,4 @@ void f(void)
 void g(void)
 {
   template f<int>(); /* { dg-error "expected primary-expression" "primary-expression" } */
-  /* { dg-error "expected ';'" "semicolon" { target *-*-* } 12 } */
 }
diff --git a/gcc/testsuite/g++.dg/template/error52.C b/gcc/testsuite/g++.dg/template/error52.C
new file mode 100644 (file)
index 0000000..3350c8e
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/16128
+
+template<typename T>
+struct A {
+    };
+
+namespace H {
+    template<typename T>
+    struct B {};
+    }
+
+A a;             // { dg-error "template" }
+H::B b;          // { dg-error "template" }
+
+int main() {
+    A a;         // { dg-error "template" }
+    H::B b;      // { dg-error "template" }
+    return 0;
+    }
index 925d8635c1e9c19aee8834d91908f2eefe34007d..605500e784afa2e539f6d0e56179a0053c1cd71d 100644 (file)
@@ -37,10 +37,9 @@ int main()
     ;
 
   A bar;                       // { dg-error "not declared" "decl" } 
-  // { dg-error "expected" "exp" { target *-*-* } 39 }
   
   if (enum A { one, two, three } foo = one) // { dg-error "defined" "def" } 
-  // { dg-error "not declared" "expected" { target *-*-* } 42 }
+  // { dg-error "not declared" "expected" { target *-*-* } 41 }
     ;
 
   struct B { operator int () { return 2; } };
@@ -49,7 +48,7 @@ int main()
     ;
 
   if (int f () = 1)            // { dg-warning "extern" "extern" } 
-  // { dg-error "is initialized like a variable" "var" { target *-*-* } 51 }
+  // { dg-error "is initialized like a variable" "var" { target *-*-* } 50 }
     ;
   
   if (int a[2] = {1, 2})       // { dg-error "extended init" "" { target c++98 } }
index 42e6baa55c5f0e5f7e818cece64c2c16fa4a9ea3..9c201178e20de0cc3c15db23d9e8712f87f38004 100644 (file)
@@ -4,19 +4,17 @@ void foo() {
   for (class C {};;)
     ;
   C c;         // { dg-error "declared" "decl" } 
-  // { dg-error "expected" "exp" { target *-*-* } 6 }
 }
 
 void bar() {
   for (enum E {num};;)
     ;
   E e;         // { dg-error "declared" "decl" } 
-  // { dg-error "expected" "exp" { target *-*-* } 13 }
 }
 
 void bee () {
   int i = 0;
   for (int fun() = 0; i != 2; ++i) {   // { dg-warning "extern" "extern" }
-  // { dg-error "initialized" "init" { target *-*-* } 19 }
+  // { dg-error "initialized" "init" { target *-*-* } 17 }
   }
 }
index f2352c2221659cf48e8ad85c409d58374b7c1cf9..d66dbd8944057578416009c6547e699cbdc7c64e 100644 (file)
@@ -16,7 +16,7 @@ class test_square
 
 template <class BOX> void test(BOX *the_box)
     {x                         // { dg-error "not declared in this scope" }
-    the_box->print();          // { dg-error "before" }
+    the_box->print();
     }
 
 template void test<> (test_box *);
index 2e918d28215f32a030e2aa1e6e9a95d523f1672c..f3292ecf3915226e77574f7193d828b7989c7f89 100644 (file)
@@ -35,7 +35,7 @@ int main (void)
     abort ();
 
   MyRootClass.int;        /* { dg-error "expected identifier" } */
-                          /* { dg-error "expected" "" { target *-*-* } 37 } */
+
   if (MyRootClass.int)    /* { dg-error "expected identifier" } */
                           /* { dg-error "expected" "" { target *-*-* } 39 } */
     abort ();