From e4d7d8cb6990399ee4a83a9a6711374ef6202795 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 7 Jan 2013 13:00:18 -0500 Subject: [PATCH] re PR c++/55753 ([C++11][4.7/4.8 Regression] ICE constexpr ctor, tsubst_copy_and_build, at cp/pt.c:14336) PR c++/55753 * tree.c (build_aggr_init_expr): Do nothing in a template. * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Strip an ADDR_EXPR off a FUNCTION_DECL before tsubsting. From-SVN: r194986 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 5 +++++ gcc/cp/tree.c | 4 ++++ gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C | 15 +++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1a872ff..74ed223 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-01-07 Jason Merrill + + PR c++/55753 + * tree.c (build_aggr_init_expr): Do nothing in a template. + * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Strip an ADDR_EXPR off + a FUNCTION_DECL before tsubsting. + 2013-01-04 Dodji Seketeli PR c++/52343 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 30bafa0..c55dabe 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13743,6 +13743,11 @@ tsubst_copy_and_build (tree t, else qualified_p = false; + if (TREE_CODE (function) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) + /* Avoid error about taking the address of a constructor. */ + function = TREE_OPERAND (function, 0); + function = tsubst_copy_and_build (function, args, complain, in_decl, !qualified_p, diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index fcab1a4..0824214 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -412,6 +412,10 @@ build_aggr_init_expr (tree type, tree init) tree rval; int is_ctor; + /* Don't build AGGR_INIT_EXPR in a template. */ + if (processing_template_decl) + return init; + if (TREE_CODE (init) == CALL_EXPR) fn = CALL_EXPR_FN (init); else if (TREE_CODE (init) == AGGR_INIT_EXPR) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C new file mode 100644 index 0000000..ed01a31 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C @@ -0,0 +1,15 @@ +// PR c++/55753 +// { dg-options -std=c++11 } + +struct A +{ + double r,i; + constexpr A(double r = 0.0, double i = 0.0): r(r), i(i) {} +}; + +template +struct B { + B() { + A((true ? 1.0 : A())); + } +}; -- 2.7.4