From: Paolo Carlini Date: Thu, 6 Sep 2007 18:38:49 +0000 (+0000) Subject: re PR c++/32674 (ICE in lvalue_p_1 initialising static variable inside template class) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a125de0cbf0106312c61b65872eec96a9f28f5d4;p=gcc.git re PR c++/32674 (ICE in lvalue_p_1 initialising static variable inside template class) /cp 2007-09-06 Paolo Carlini PR c++/32674 * decl.c (cp_finish_decl): When processing_template_decl, deal correctly with init as TREE_LIST. /testsuite 2007-09-06 Paolo Carlini PR c++/32674 * g++.dg/template/static31.C: New. From-SVN: r128201 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index db8b3eba13a..2c3533d8ea1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-09-06 Paolo Carlini + + PR c++/32674 + * decl.c (cp_finish_decl): When processing_template_decl, + deal correctly with init as TREE_LIST. + 2007-09-06 Tom Tromey * decl.c (finish_function): Put return's location on line zero of diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 86f2a4a1c16..271b8e6885f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5333,7 +5333,21 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, goto finish_end; } - init = fold_non_dependent_expr (init); + if (TREE_CODE (init) == TREE_LIST) + { + /* If the parenthesized-initializer form was used (e.g., + "int A::i(X)"), then INIT will be a TREE_LIST of initializer + arguments. (There is generally only one.) We convert them + individually. */ + tree list = init; + for (; list; list = TREE_CHAIN (list)) + { + tree elt = TREE_VALUE (list); + TREE_VALUE (list) = fold_non_dependent_expr (elt); + } + } + else + init = fold_non_dependent_expr (init); processing_template_decl = 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12fa069b5fa..de450f6ca03 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-06 Paolo Carlini + + PR c++/32674 + * g++.dg/template/static31.C: New. + 2007-09-06 Francois-Xavier Coudert PR fortran/33271 diff --git a/gcc/testsuite/g++.dg/template/static31.C b/gcc/testsuite/g++.dg/template/static31.C new file mode 100644 index 00000000000..935a8a790fa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static31.C @@ -0,0 +1,19 @@ +// PR c++/32674 + +class C +{ + static const int j = 3; +}; + +template class A +{ + static const int i1; + static const int i2; + static const int i3; + static const int i4; +}; + +template const int A::i1(C::j); +template const int A::i2 = C::j; +template const int A::i3(C::j, 5); // { dg-error "compound expression" } +template const int A::i4 = (C::j, 7);