From: Jakub Jelinek Date: Tue, 20 Nov 2007 06:38:48 +0000 (+0100) Subject: re PR c++/28879 (ICE with VLA in template function) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6da06848ec8206c9824187019a9168b7aa38c94e;p=platform%2Fupstream%2Fgcc.git re PR c++/28879 (ICE with VLA in template function) PR c++/28879 * tree.c (build_cplus_array_type_1): Don't pass any VLA types when processing_template_decl to build_array_type. * g++.dg/template/vla2.C: New test. From-SVN: r130309 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d8e95c6..b7c7661 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2007-11-20 Jakub Jelinek + PR c++/28879 + * tree.c (build_cplus_array_type_1): Don't pass any VLA types + when processing_template_decl to build_array_type. + PR c++/33962 * pt.c (more_specialized_fn): Don't segfault if one or both argument list end with ellipsis. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 2a7cd3a..252195d 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -529,9 +529,9 @@ build_cplus_array_type_1 (tree elt_type, tree index_type) if (elt_type == error_mark_node || index_type == error_mark_node) return error_mark_node; - if (dependent_type_p (elt_type) - || (index_type - && value_dependent_expression_p (TYPE_MAX_VALUE (index_type)))) + if (processing_template_decl + && (dependent_type_p (elt_type) + || (index_type && !TREE_CONSTANT (TYPE_MAX_VALUE (index_type))))) { void **e; cplus_array_info cai; @@ -570,7 +570,7 @@ build_cplus_array_type_1 (tree elt_type, tree index_type) TYPE_CANONICAL (t) = build_cplus_array_type (TYPE_CANONICAL (elt_type), - index_type? TYPE_CANONICAL (index_type) : index_type); + index_type ? TYPE_CANONICAL (index_type) : index_type); else TYPE_CANONICAL (t) = t; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 585c720..cd4b067 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-11-20 Jakub Jelinek + PR c++/28879 + * g++.dg/template/vla2.C: New test. + PR c++/33962 * g++.dg/overload/template3.C: New test. diff --git a/gcc/testsuite/g++.dg/template/vla2.C b/gcc/testsuite/g++.dg/template/vla2.C new file mode 100644 index 0000000..183f8fa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/vla2.C @@ -0,0 +1,20 @@ +// PR c++/28879 +// { dg-do compile } +// { dg-options "" } + +struct A +{ + static int i; + int j; +}; + +template void foo () +{ + int x[A::i]; +//int y[A().j]; +} + +void bar () +{ + foo<6> (); +}