diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7e282d83f51..73d1b931fb1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-02-10 Jason Merrill + + PR c++/64994 + * constexpr.c (cxx_eval_call_expression): Walk the clone list. + 2015-02-10 Jan Hubicka PR ipa/64982 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index f1434207520..2b56cb2d62b 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1348,8 +1348,12 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t, if (DECL_SAVED_TREE (fun) == NULL_TREE && (DECL_CONSTRUCTOR_P (fun) || DECL_DESTRUCTOR_P (fun))) /* The maybe-in-charge 'tor had its DECL_SAVED_TREE - cleared, try the first clone. */ - fun = DECL_CHAIN (fun); + cleared, try a clone. */ + for (fun = DECL_CHAIN (fun); + fun && DECL_CLONED_FUNCTION_P (fun); + fun = DECL_CHAIN (fun)) + if (DECL_SAVED_TREE (fun)) + break; gcc_assert (DECL_SAVED_TREE (fun)); tree parms, res; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor18.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor18.C new file mode 100644 index 00000000000..fa4ff7cc75e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor18.C @@ -0,0 +1,26 @@ +// PR c++/64994 +// { dg-do compile { target c++11 } } + +class TimeStamp { +public: + constexpr TimeStamp() : mValue() {} + int mValue; +}; + +class A { + class B; + A(bool); +}; +class C { + TimeStamp mFadeBeginTime; +}; +class A::B { +public: + B(int) {} + TimeStamp mPrevEventTime[1]; +}; + +A::A(bool) { + new C; + B(0); +}