From b6413764c0dd056f000c6541913e95af9bddbb3e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 21 May 2011 18:01:38 -0400 Subject: [PATCH] re PR c++/48945 ([C++0x] static constexpr member function cannot be defined out-of class) PR c++/48945 * decl.c (revert_static_member_fn): Ignore const on constexpr fn. From-SVN: r174006 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/decl.c | 9 +++++++-- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C | 8 ++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 83c43e0243e..65479eabdc3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-05-20 Jason Merrill + PR c++/48945 + * decl.c (revert_static_member_fn): Ignore const on constexpr fn. + PR c++/48780 * cvt.c (type_promotes_to): Don't promote scoped enums. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index eae7d8ec69b..598af1c482e 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -13575,10 +13575,15 @@ void revert_static_member_fn (tree decl) { tree stype = static_fn_type (decl); + cp_cv_quals quals = type_memfn_quals (stype); - if (type_memfn_quals (stype) != TYPE_UNQUALIFIED) + if (quals != TYPE_UNQUALIFIED) { - error ("static member function %q#D declared with type qualifiers", decl); + if (quals == TYPE_QUAL_CONST && DECL_DECLARED_CONSTEXPR_P (decl)) + /* The const was implicit, don't complain. */; + else + error ("static member function %q#D declared with type qualifiers", + decl); stype = apply_memfn_quals (stype, TYPE_UNQUALIFIED); } TREE_TYPE (decl) = stype; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9cb673b143e..9e01b4e9813 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-05-20 Jason Merrill + * g++.dg/cpp0x/constexpr-static7.C: New. + * g++.dg/cpp0x/enum12.C: New. * g++.dg/cpp0x/enum13.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C new file mode 100644 index 00000000000..ba4a2518407 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C @@ -0,0 +1,8 @@ +// PR c++/48945 +// { dg-options -std=c++0x } + +struct A { + static constexpr bool is(); +}; + +constexpr bool A::is() { return true; } -- 2.30.2