re PR c++/89875 (invalid typeof reference to a member of an incomplete struct accepte...
authorPaolo Carlini <paolo@gcc.gnu.org>
Wed, 29 May 2019 17:30:36 +0000 (17:30 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 29 May 2019 17:30:36 +0000 (17:30 +0000)
/cp
2019-05-29  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/89875
* parser.c (cp_parser_sizeof_operand): When the type-id production
did not work out commit to the tentative parse.

/testsuite
2019-05-29  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/89875
* g++.dg/cpp0x/decltype-pr66548.C: Remove xfail.
* g++.dg/template/sizeof-template-argument.C: Adjust expected error.

From-SVN: r271746

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype-pr66548.C
gcc/testsuite/g++.dg/template/sizeof-template-argument.C

index d0122c7b024236bd68b21260ab95dcca354c8c22..ee7eab080cbc87d2211c58bd3716a29750c5660f 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/89875
+       * parser.c (cp_parser_sizeof_operand): When the type-id production
+       did not work out commit to the tentative parse.
+
 2019-05-29  Jakub Jelinek  <jakub@redhat.com>
 
        P1091R3 - Extending structured bindings to be more like var decls
index 08b4105c97f8c8af35f4a005be103e52a175623c..1de35da83ec18122266234ae36123b183bba9242 100644 (file)
@@ -28942,6 +28942,8 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
     {
       tree type = NULL_TREE;
 
+      tentative_firewall firewall (parser);
+
       /* We can't be sure yet whether we're looking at a type-id or an
         expression.  */
       cp_parser_parse_tentatively (parser);
@@ -28969,11 +28971,15 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
       /* If all went well, then we're done.  */
       if (cp_parser_parse_definitely (parser))
        expr = type;
-    }
+      else
+       {
+         /* Commit to the tentative_firewall so we get syntax errors.  */
+         cp_parser_commit_to_tentative_parse (parser);
 
-  /* If the type-id production did not work out, then we must be
-     looking at the unary-expression production.  */
-  if (!expr)
+         expr = cp_parser_unary_expression (parser);
+       }
+    }
+  else
     expr = cp_parser_unary_expression (parser);
 
   /* Go back to evaluating expressions.  */
index a2d46357e3995b32fd4c3189a3f67ea11166de56..19971c9a1ba308bd47d1e7557dd100f17be2f73a 100644 (file)
@@ -1,7 +1,13 @@
+2019-05-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/89875
+       * g++.dg/cpp0x/decltype-pr66548.C: Remove xfail.
+       * g++.dg/template/sizeof-template-argument.C: Adjust expected error.
+
 2019-05-29  Alejandro Martinez  <alejandro.martinezvicente@arm.com>
 
-       * gcc.target/aarch64/sve2/aarch64-sve2.exp: New file, regression driver
-       for AArch64 SVE2.
+       * gcc.target/aarch64/sve2/aarch64-sve2.exp: New file, regression
+       driver for AArch64 SVE2.
        * gcc.target/aarch64/sve2/average_1.c: New test.
        * lib/target-supports.exp (check_effective_target_aarch64_sve2): New
        helper.
index 93a7d490f2fc00434ad130d7bf80cdfb7f8eb81a..3757b671fdd55f052a614d7e9e28497fee3ed5ba 100644 (file)
@@ -11,7 +11,7 @@ struct Meow {};
 
 void f ()
 {
-  decltype (Meow.purr ()) d;   // { dg-error "expected primary-expression" "pr89875" { xfail c++98_only } }
+  decltype (Meow.purr ()) d;   // { dg-error "expected primary-expression" }
   (void)&d;
 }
 
index 31aeeec9bfcc827c2e8ecfadb6bdd074ce7f1fec..2bfff6d9a18a4495a8cffb33da8398dc2d428fd4 100644 (file)
@@ -3,9 +3,9 @@
 
 template<int> struct A {};
 
-template<typename> struct B : A <sizeof(=)> {}; /* { dg-error "template argument" } */
+template<typename> struct B : A <sizeof(=)> {}; /* { dg-error "expected primary-expression" } */
 
-template<typename> struct C : A <sizeof(=)> {}; /* { dg-error "template argument" } */
+template<typename> struct C : A <sizeof(=)> {}; /* { dg-error "expected primary-expression" } */
 
 int a;