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
This commit is contained in:
Jason Merrill 2015-01-15 15:46:03 -05:00 committed by Jason Merrill
parent 4c16468417
commit c3c29ba588
4 changed files with 22 additions and 2 deletions

View File

@ -1,3 +1,9 @@
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>
James Norris <jnorris@codesourcery.com>
Cesar Philippidis <cesar@codesourcery.com>

View File

@ -3881,7 +3881,11 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
for (; i < nargs; ++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 true;

View File

@ -0,0 +1,10 @@
// 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>(); }

View File

@ -4,5 +4,5 @@
template<typename T> bool foo(T)
{
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" }
}