aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-04-17 14:05:54 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2003-04-17 14:05:54 +0000
commit09d2f85f414ab684b274f275593f6531c49f9cb3 (patch)
treef48deea57e0f5b9e45cc71a1ebdd7890344752c3 /gcc
parent8633f25cf5259062451db10d6f4086fbe1bc712c (diff)
downloadgcc-09d2f85f414ab684b274f275593f6531c49f9cb3.zip
gcc-09d2f85f414ab684b274f275593f6531c49f9cb3.tar.gz
gcc-09d2f85f414ab684b274f275593f6531c49f9cb3.tar.bz2
re PR c++/10347 (tree check ICE in dependent_type_p)
PR c++/10347 * pt.c (type_dependent_expression_p): Handle array new. g++.dg/template/dependent-name1.C: New test. From-SVN: r65742
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/dependent-name1.C11
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7ce1498..093198c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2003-04-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/10347
+ * pt.c (type_dependent_expression_p): Handle array new.
+
2003-04-15 Mark Mitchell <mark@codesourcery.com>
PR c++/10381
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index c8e7c40..41baea5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11562,7 +11562,20 @@ type_dependent_expression_p (expression)
by the expression. */
else if (TREE_CODE (expression) == NEW_EXPR
|| TREE_CODE (expression) == VEC_NEW_EXPR)
- return dependent_type_p (TREE_OPERAND (expression, 1));
+ {
+ /* For NEW_EXPR tree nodes created inside a template, either
+ the object type itself or a TREE_LIST may appear as the
+ operand 1. */
+ tree type = TREE_OPERAND (expression, 1);
+ if (TREE_CODE (type) == TREE_LIST)
+ /* This is an array type. We need to check array dimensions
+ as well. */
+ return dependent_type_p (TREE_VALUE (TREE_PURPOSE (type)))
+ || value_dependent_expression_p
+ (TREE_OPERAND (TREE_VALUE (type), 1));
+ else
+ return dependent_type_p (type);
+ }
if (TREE_CODE (expression) == FUNCTION_DECL
&& DECL_LANG_SPECIFIC (expression)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b289626..bae6d9e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-04-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/10347
+ g++.dg/template/dependent-name1.C: New test.
+
2003-04-17 J"orn Rennecke <joern.rennecke@superh.com>
* gcc.dg/warn-1.c (tourist_guide): New array,
diff --git a/gcc/testsuite/g++.dg/template/dependent-name1.C b/gcc/testsuite/g++.dg/template/dependent-name1.C
new file mode 100644
index 0000000..60ab344
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/dependent-name1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/10347: Dependent type checking of array new expression
+
+void bar (int *);
+
+template <int> void foo() {
+ bar(new int[1]);
+}