diff options
author | Jason Merrill <jason@redhat.com> | 2011-02-20 18:18:01 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-02-20 18:18:01 -0500 |
commit | 525c617d3b92c10f79d1ffc786fb87dbf0958f0b (patch) | |
tree | 8a590edbc03e46894ebeec789e1172f529bcb970 /gcc/cp | |
parent | ceccaacf4f6bb19faa219ceeefde81e582267a1e (diff) | |
download | gcc-525c617d3b92c10f79d1ffc786fb87dbf0958f0b.zip gcc-525c617d3b92c10f79d1ffc786fb87dbf0958f0b.tar.gz gcc-525c617d3b92c10f79d1ffc786fb87dbf0958f0b.tar.bz2 |
re PR c++/46472 ([C++0X] constexpr is not constexpr)
PR c++/46472
* method.c (process_subob_fn): Instantiate constexpr templates.
* optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P.
From-SVN: r170348
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/method.c | 13 | ||||
-rw-r--r-- | gcc/cp/optimize.c | 1 |
3 files changed, 18 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a40fd02..b867ef3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-02-20 Jason Merrill <jason@redhat.com> + + PR c++/46472 + * method.c (process_subob_fn): Instantiate constexpr templates. + * optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P. + 2011-02-20 Dodji Seketeli <dodji@redhat.com> PR c++/46394 diff --git a/gcc/cp/method.c b/gcc/cp/method.c index bfe8a06..47f1808 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -941,8 +941,17 @@ process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p, goto bad; } - if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn)) - *constexpr_p = false; + if (constexpr_p) + { + /* If this is a specialization of a constexpr template, we need to + force the instantiation now so that we know whether or not it's + really constexpr. */ + if (DECL_DECLARED_CONSTEXPR_P (fn) && DECL_TEMPLATE_INSTANTIATION (fn) + && !DECL_TEMPLATE_INSTANTIATED (fn)) + instantiate_decl (fn, /*defer_ok*/false, /*expl_class*/false); + if (!DECL_DECLARED_CONSTEXPR_P (fn)) + *constexpr_p = false; + } return; diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index b00bc28..ed59f91 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -256,6 +256,7 @@ maybe_clone_body (tree fn) /* Update CLONE's source position information to match FN's. */ DECL_SOURCE_LOCATION (clone) = DECL_SOURCE_LOCATION (fn); DECL_DECLARED_INLINE_P (clone) = DECL_DECLARED_INLINE_P (fn); + DECL_DECLARED_CONSTEXPR_P (clone) = DECL_DECLARED_CONSTEXPR_P (fn); DECL_COMDAT (clone) = DECL_COMDAT (fn); DECL_WEAK (clone) = DECL_WEAK (fn); |