aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2009-06-08 18:26:01 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2009-06-08 18:26:01 +0200
commit85a988d14eba08447282db312f99637a527bfba0 (patch)
tree0996b2383b9560e0508fc26e2c0b221bced86d75 /gcc
parentdb34470d17bd803cf74f747e7714f6029abd9b38 (diff)
downloadgcc-85a988d14eba08447282db312f99637a527bfba0.zip
gcc-85a988d14eba08447282db312f99637a527bfba0.tar.gz
gcc-85a988d14eba08447282db312f99637a527bfba0.tar.bz2
re PR c++/40370 (ICE with invalid array bound in template class)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/parser.c13
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/g++.dg/template/error41.C12
-rw-r--r--gcc/testsuite/g++.dg/template/error42.C20
5 files changed, 55 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 12020e8..5c0d473 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 00f2580..05ae257 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eec29c7..9c7651d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..c92b849
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error41.C
@@ -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
index 0000000..0d651e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error42.C
@@ -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" }
+ }
+};