]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/40370 (ICE with invalid array bound in template class)
authorJakub Jelinek <jakub@gcc.gnu.org>
Mon, 8 Jun 2009 16:26:01 +0000 (18:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 8 Jun 2009 16:26:01 +0000 (18:26 +0200)
PR c++/40370
PR c++/40372
* parser.c (cp_parser_direct_declarator): Don't set TREE_SIDE_EFFECTS
on error_mark_node.  Check for VLAs outside of function context
before check whether to wrap bounds into a NOP_EXPR with
TREE_SIDE_EFFECTS.

* g++.dg/template/error41.C: New test.
* g++.dg/template/error42.C: New test.

From-SVN: r148278

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/error41.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/error42.C [new file with mode: 0644]

index 12020e84bea0cc63f6c37818659f49c1abdc449d..5c0d4730ce6d91c25348b35133c07342730e7e2f 100644 (file)
@@ -1,3 +1,12 @@
+2009-06-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/40370
+       PR c++/40372
+       * parser.c (cp_parser_direct_declarator): Don't set TREE_SIDE_EFFECTS
+       on error_mark_node.  Check for VLAs outside of function context
+       before check whether to wrap bounds into a NOP_EXPR with
+       TREE_SIDE_EFFECTS.
+
 2009-06-08  Alexandre Oliva  <aoliva@redhat.com>
 
        * repo.c (get_base_filename): Use aux_base_name rather than
index 00f258060823091838aea53482dd701d6988b8e3..05ae257fbf79c19da4369cb7d76e31f35f412f01 100644 (file)
@@ -13336,13 +13336,6 @@ cp_parser_direct_declarator (cp_parser* parser,
                                                 &non_constant_p);
              if (!non_constant_p)
                bounds = fold_non_dependent_expr (bounds);
-             else if (processing_template_decl)
-               {
-                 /* Remember this wasn't a constant-expression.  */
-                 bounds = build_nop (TREE_TYPE (bounds), bounds);
-                 TREE_SIDE_EFFECTS (bounds) = 1;
-               }
-
              /* Normally, the array bound must be an integral constant
                 expression.  However, as an extension, we allow VLAs
                 in function scopes.  */
@@ -13352,6 +13345,12 @@ cp_parser_direct_declarator (cp_parser* parser,
                         &token->location);
                  bounds = error_mark_node;
                }
+             else if (processing_template_decl && !error_operand_p (bounds))
+               {
+                 /* Remember this wasn't a constant-expression.  */
+                 bounds = build_nop (TREE_TYPE (bounds), bounds);
+                 TREE_SIDE_EFFECTS (bounds) = 1;
+               }
            }
          else
            bounds = NULL_TREE;
index eec29c75a26d621db4a4b11e939149440e2115f5..9c7651db722fab07ff0b5868be9f39cb3b27c189 100644 (file)
@@ -1,6 +1,13 @@
+2009-06-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/40370
+       PR c++/40372
+       * g++.dg/template/error41.C: New test.
+       * g++.dg/template/error42.C: New test.
+
 2009-06-08  Revital Eres  <eres@il.ibm.com>
 
-       PR40359
+       PR testsuite/40359
        * gcc.dg/vect/vect-58.c: Change checks to use vect_hw_misalign.
        * gcc.dg/vect/vect-88.c: Likewise.
        * gcc.dg/vect/no-section-anchors-vect-66.c: Likewise.
diff --git a/gcc/testsuite/g++.dg/template/error41.C b/gcc/testsuite/g++.dg/template/error41.C
new file mode 100644 (file)
index 0000000..c92b849
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/40370
+// { dg-do compile }
+
+struct A
+{
+  static int i;
+};
+
+template <int> struct B
+{
+  int x[A::i]; // { dg-error "array bound is not an integer constant" }
+};
diff --git a/gcc/testsuite/g++.dg/template/error42.C b/gcc/testsuite/g++.dg/template/error42.C
new file mode 100644 (file)
index 0000000..0d651e3
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/40372
+// { dg-do compile }
+
+template <int> struct A
+{
+  int i;               // { dg-error "invalid use of non-static data member" }
+  friend void foo ()
+  {
+    int x[i];          // { dg-error "from this location" }
+  }
+};
+
+struct B
+{
+  int j;               // { dg-error "invalid use of non-static data member" }
+  friend int bar ()
+  {
+    return j;          // { dg-error "from this location" }
+  }
+};