Commit c3c29ba5 by Jason Merrill Committed by Jason Merrill

re PR c++/63283 (constexpr function called by templated function is not treated as constexpr)

	PR c++/63283
	* constexpr.c (potential_constant_expression_1): Handle reference
	args in templates.

From-SVN: r219686
parent 4c164684
2015-01-15 Jason Merrill <jason@redhat.com>
PR c++/63283
* constexpr.c (potential_constant_expression_1): Handle reference
args in templates.
2015-01-15 Thomas Schwinge <thomas@codesourcery.com> 2015-01-15 Thomas Schwinge <thomas@codesourcery.com>
James Norris <jnorris@codesourcery.com> James Norris <jnorris@codesourcery.com>
Cesar Philippidis <cesar@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com>
......
...@@ -3881,7 +3881,11 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, ...@@ -3881,7 +3881,11 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
for (; i < nargs; ++i) for (; i < nargs; ++i)
{ {
tree x = get_nth_callarg (t, i); tree x = get_nth_callarg (t, i);
if (!RECUR (x, rval)) /* In a template, reference arguments haven't been converted to
REFERENCE_TYPE and we might not even know if the parameter
is a reference, so accept lvalue constants too. */
bool rv = processing_template_decl ? any : rval;
if (!RECUR (x, rv))
return false; return false;
} }
return true; return true;
......
// PR c++/63283
// { dg-do compile { target c++11 } }
constexpr int array_length(int (&array)[3]) { return 3; }
int a[] = { 1, 2, 3 };
template <typename T> int f() {
struct { int e[array_length(a)]; } t;
return sizeof(t);
}
int main() { f<void>(); }
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
template<typename T> bool foo(T) template<typename T> bool foo(T)
{ {
int i; int i;
static_assert(foo(i), "Error"); // { dg-error "non-constant condition|not usable" } static_assert(foo(i), "Error"); // { dg-error "non-constant condition|not usable|non-constexpr" }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment