aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-09-13 11:13:24 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-09-13 11:13:24 -0400
commit7c8233ce846dd7f68992b0bbfafae87fb46b83ab (patch)
tree484ac0663eeec9388f8a32a415395efdffee7f76 /gcc
parentc915f8bca422b3e7f76c9e2e87667c516627c728 (diff)
downloadgcc-7c8233ce846dd7f68992b0bbfafae87fb46b83ab.zip
gcc-7c8233ce846dd7f68992b0bbfafae87fb46b83ab.tar.gz
gcc-7c8233ce846dd7f68992b0bbfafae87fb46b83ab.tar.bz2
re PR c++/53836 (ICE: unexpected expression of kind template_parm_index)
PR c++/53836 * pt.c (value_dependent_expression_p): A TREE_LIST initializer must be dependent. From-SVN: r191261
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/init10.C15
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bd62046..b7d8a1d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/53836
+ * pt.c (value_dependent_expression_p): A TREE_LIST initializer must
+ be dependent.
+
2012-09-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54541
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 768f141..4cf2ed8 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19199,10 +19199,15 @@ value_dependent_expression_p (tree expression)
case VAR_DECL:
/* A constant with literal type and is initialized
- with an expression that is value-dependent. */
+ with an expression that is value-dependent.
+
+ Note that a non-dependent parenthesized initializer will have
+ already been replaced with its constant value, so if we see
+ a TREE_LIST it must be dependent. */
if (DECL_INITIAL (expression)
&& decl_constant_var_p (expression)
- && value_dependent_expression_p (DECL_INITIAL (expression)))
+ && (TREE_CODE (DECL_INITIAL (expression)) == TREE_LIST
+ || value_dependent_expression_p (DECL_INITIAL (expression))))
return true;
return false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d6c6e23..debdd88 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/53836
+ * g++.dg/template/init10.C: New.
+
2012-09-13 Tobias Burnus <burnus@net-b.de>
PR fortran/54556
diff --git a/gcc/testsuite/g++.dg/template/init10.C b/gcc/testsuite/g++.dg/template/init10.C
new file mode 100644
index 0000000..1480622
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/init10.C
@@ -0,0 +1,15 @@
+template <int N>
+struct A { };
+
+template <int Q>
+void g()
+{
+ const int M ( Q );
+
+ A<M> a;
+}
+
+void h()
+{
+ g<3>();
+}