aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2013-01-15 09:12:30 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2013-01-15 10:12:30 +0100
commitcd61690f63612fc5e50945e446a44b9ee34c088c (patch)
treeb55d0860e61bfea46c17cab939daafaff581504a /libjava/classpath
parent955f5a07c96b8dda489e50ca8a79fb623b4cdb97 (diff)
downloadgcc-cd61690f63612fc5e50945e446a44b9ee34c088c.zip
gcc-cd61690f63612fc5e50945e446a44b9ee34c088c.tar.gz
gcc-cd61690f63612fc5e50945e446a44b9ee34c088c.tar.bz2
PR c++/55663 - constexpr function templ instantiation
Consider the example of the problem report 1 template <typename> 2 constexpr bool the_truth () { return true; } 3 4 template <bool> 5 struct Takes_bool { }; 6 7 template<bool B> 8 using Alias = Takes_bool<B>; 9 10 template<typename T> 11 struct test { using type = Alias<the_truth<T>()>; }; 12 13 int main () { 14 test<int> a; 15 16 return 0; 17 } that yields the error: test.cc: In substitution of ‘template<bool B> using Alias = Takes_bool<B> [with bool B = the_truth<int>()]’: test.cc:11:51: required from ‘struct test<int>’ test.cc:14:13: required from here test.cc:11:51: error: integral expression ‘the_truth<int>()’ is not constant struct test { using type = Alias<the_truth<T>()>; }; I think the issue happens in the course of instantiating test<int> at line 14, when we look into instantiating Alias<the_truth<T>()> (at line 11) (using instantiate_alias_template) with T = int. There, when we check the argument 'the_truth<int>()' to see if it actually is a constant expression, in check_instantiated_arg, we fail to recognize it constexpr-ness b/c we just look at its TREE_CONSTANT. At that point, the_truth<int> should have been folded, and it's not, because instantiate_alias_template forgets to call coerce_template_parms on its arguments. Fixed thus, bootstapped and tested on x86_64-unknown-linux-gnu against trunk. gcc/cp/ PR c++/55663 * pt.c (coerce_innermost_template_parms): New static function. (instantiate_alias_template): Use it here. gcc/testsuite/ PR c++/55663 * g++.dg/cpp0x/alias-decl-31.C: New test. From-SVN: r195189
Diffstat (limited to 'libjava/classpath')
0 files changed, 0 insertions, 0 deletions