re PR c++/51404 ([c++0x] [4.7 Regression] ICE with invalid use of auto)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 5 Dec 2011 15:46:30 +0000 (15:46 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 5 Dec 2011 15:46:30 +0000 (15:46 +0000)
/cp
2011-12-05  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51404
* typeck2.c (build_functional_cast): Early return error_mark_node
for invalid uses of 'auto'.
* parser.c (cp_parser_direct_declarator): When
cp_parser_constant_expression returns error do not produce further
diagnostic for the bound.

/testsuite
2011-12-05  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51404
* g++.dg/cpp0x/auto28.C: New.

From-SVN: r182011

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/auto28.C [new file with mode: 0644]

index 8f26f239ffd20fa1c14af62015da6353a43d08a6..fcd44f072deb93882027c267d10f957a7174dece 100644 (file)
@@ -1,3 +1,12 @@
+2011-12-05  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51404
+       * typeck2.c (build_functional_cast): Early return error_mark_node
+       for invalid uses of 'auto'.
+       * parser.c (cp_parser_direct_declarator): When
+       cp_parser_constant_expression returns error do not produce further
+       diagnostic for the bound.
+
 2011-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51313
index 2fdd6753d08802add0bc441b9df28e47c9767f12..69f1eabb940eeecd5bc390bb57439179083cdda0 100644 (file)
@@ -16055,18 +16055,20 @@ cp_parser_direct_declarator (cp_parser* parser,
                                                 &non_constant_p);
              if (!non_constant_p)
                /* OK */;
-             /* Normally, the array bound must be an integral constant
-                expression.  However, as an extension, we allow VLAs
-                in function scopes as long as they aren't part of a
-                parameter declaration.  */
+             else if (error_operand_p (bounds))
+               /* Already gave an error.  */;
              else if (!parser->in_function_body
                       || current_binding_level->kind == sk_function_parms)
                {
+                 /* Normally, the array bound must be an integral constant
+                    expression.  However, as an extension, we allow VLAs
+                    in function scopes as long as they aren't part of a
+                    parameter declaration.  */
                  cp_parser_error (parser,
                                   "array bound is not an integer constant");
                  bounds = error_mark_node;
                }
-             else if (processing_template_decl && !error_operand_p (bounds))
+             else if (processing_template_decl)
                {
                  /* Remember this wasn't a constant-expression.  */
                  bounds = build_nop (TREE_TYPE (bounds), bounds);
index 70edc2f5a4df258c974da4cb79d28b92f38f0da6..2db3248d02824b4d28251f9882a62e2a55caa9a5 100644 (file)
@@ -1653,7 +1653,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
     {
       if (complain & tf_error)
        error ("invalid use of %<auto%>");
-      type = error_mark_node;
+      return error_mark_node;
     }
 
   if (processing_template_decl)
index 20917403709aa0be95fd10732fc160d2072ad235..31aa738768d293cc8f2169afc673fddbcdc90f27 100644 (file)
@@ -1,3 +1,8 @@
+2011-12-05  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51404
+       * g++.dg/cpp0x/auto28.C: New.
+
 2011-12-05  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
 
        * gcc.dg/torture/vec-cvt-1.c (FLTTEST): Call rand instead of random.
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto28.C b/gcc/testsuite/g++.dg/cpp0x/auto28.C
new file mode 100644 (file)
index 0000000..8d25016
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/51404
+// { dg-options -std=c++0x }
+
+int i = auto().x;  // { dg-error "invalid use of" }