diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-04-17 14:05:54 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-04-17 14:05:54 +0000 |
commit | 09d2f85f414ab684b274f275593f6531c49f9cb3 (patch) | |
tree | f48deea57e0f5b9e45cc71a1ebdd7890344752c3 /gcc | |
parent | 8633f25cf5259062451db10d6f4086fbe1bc712c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dependent-name1.C | 11 |
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]); +} |