From 09d2f85f414ab684b274f275593f6531c49f9cb3 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Thu, 17 Apr 2003 14:05:54 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 15 ++++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/dependent-name1.C | 11 +++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/dependent-name1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7ce14982dd1..093198c567f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2003-04-17 Kriang Lerdsuwanakij + + PR c++/10347 + * pt.c (type_dependent_expression_p): Handle array new. + 2003-04-15 Mark Mitchell PR c++/10381 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c8e7c4089e2..41baea5b4dc 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 b28962681eb..bae6d9ed4cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-04-17 Kriang Lerdsuwanakij + + PR c++/10347 + g++.dg/template/dependent-name1.C: New test. + 2003-04-17 J"orn Rennecke * 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 00000000000..60ab34498fd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name1.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth + +// PR c++/10347: Dependent type checking of array new expression + +void bar (int *); + +template void foo() { + bar(new int[1]); +} -- 2.30.2