From c6f54c7aa725bb4bb8bb3af16cc49a855b3587ae Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 2 Mar 2011 13:18:31 -0500 Subject: [PATCH] re PR c++/47200 ([C++0x] ICE: in adjust_temp_type, at cp/semantics.c:5821 with missing definition of constexpr function) PR c++/47200 * semantics.c (cxx_bind_parameters_in_call): Don't call adjust_temp_type on non-constant args. From-SVN: r170620 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/semantics.c | 3 +++ gcc/testsuite/ChangeLog | 4 ++++ .../g++.dg/cpp0x/constexpr-non-const-arg2.C | 16 ++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1a522e7a979..2a5244f364e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-03-01 Jason Merrill + PR c++/47200 + * semantics.c (cxx_bind_parameters_in_call): Don't call + adjust_temp_type on non-constant args. + PR c++/47851 * call.c (standard_conversion): Provide requested cv-quals on class rvalue conversion. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index a33a7edd314..6b3e9149a80 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5906,6 +5906,9 @@ cxx_bind_parameters_in_call (const constexpr_call *old_call, tree t, /* Just discard ellipsis args after checking their constantitude. */ if (!parms) continue; + if (*non_constant_p) + /* Don't try to adjust the type of non-constant args. */ + goto next; /* Make sure the binding has the same type as the parm. */ if (TREE_CODE (type) != REFERENCE_TYPE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ebe736c457b..1ac00aa9f66 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-01 Jason Merrill + + * g++.dg/cpp0x/constexpr-non-const-arg2.C: New. + 2011-03-02 Richard Sandiford PR rtl-optimization/47925 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C new file mode 100644 index 00000000000..20e05c3c068 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C @@ -0,0 +1,16 @@ +// PR c++/47200 +// { dg-options "-std=c++0x -w" } + +template < int > struct duration +{ + constexpr int count (); + static constexpr duration min (); +}; + +constexpr int +f (duration < 0 > d, duration < 0 > ) +{ + return d.count (); +} + +static_assert (f (duration < 0 >::min (), duration < 0 > ()), ""); // { dg-error "non-constant|before its definition" } -- 2.30.2