diff options
author | Jason Merrill <jason@redhat.com> | 2015-01-15 15:46:03 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-01-15 15:46:03 -0500 |
commit | c3c29ba5882f0f7db60ac2efca272a79cefa81c8 (patch) | |
tree | 694493af91762df4a383a92ec28321c741e4e30b /gcc | |
parent | 4c16468417da5c3db8e6ca93704142b9cafa10c0 (diff) | |
download | gcc-c3c29ba5882f0f7db60ac2efca272a79cefa81c8.zip gcc-c3c29ba5882f0f7db60ac2efca272a79cefa81c8.tar.gz gcc-c3c29ba5882f0f7db60ac2efca272a79cefa81c8.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-template8.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/static_assert10.C | 2 |
4 files changed, 22 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 543f4d9..7ad7737 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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> diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 1432506..e27a892 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-template8.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-template8.C new file mode 100644 index 0000000..7b2b9c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-template8.C @@ -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>(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert10.C b/gcc/testsuite/g++.dg/cpp0x/static_assert10.C index 216f259..e7f728e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/static_assert10.C +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert10.C @@ -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" } } |