From e39438c55d8d22f9ede589d3fc19bacd639be58b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 7 Sep 2011 13:11:49 -0400 Subject: [PATCH] re PR c++/50298 ([C++0x][constexpr] References cannot be bound to static constexpr reference members) PR c++/50298 * parser.c (cp_parser_member_declaration): Don't require a constant rvalue here in C++0x. From-SVN: r178652 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C | 10 ++++++++++ 4 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ea67d2d5d5a..1c6c5a160c0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-09-07 Jason Merrill + PR c++/50298 + * parser.c (cp_parser_member_declaration): Don't require a constant + rvalue here in C++0x. + * pt.c (type_unification_real): Correct complain arg for tsubsting default template args. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7d766d130ca..6346aa0386a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -18187,6 +18187,17 @@ cp_parser_member_declaration (cp_parser* parser) initializer_token_start = cp_lexer_peek_token (parser->lexer); if (function_declarator_p (declarator)) initializer = cp_parser_pure_specifier (parser); + else if (cxx_dialect >= cxx0x) + { + bool nonconst; + /* Don't require a constant rvalue in C++11, since we + might want a reference constant. We'll enforce + constancy later. */ + cp_lexer_consume_token (parser->lexer); + /* Parse the initializer. */ + initializer = cp_parser_initializer_clause (parser, + &nonconst); + } else /* Parse the initializer. */ initializer = cp_parser_constant_initializer (parser); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5247ac6b984..f3d6ddb6bff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-09-07 Jason Merrill + * g++.dg/cpp0x/constexpr-ref3.C: New. + * g++.dg/cpp0x/sfinae11.C: Check for explanatory diagnostic. 2011-09-07 Georg-Johann Lay diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C new file mode 100644 index 00000000000..24cc9c82449 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C @@ -0,0 +1,10 @@ +// PR c++/50298 +// { dg-options -std=c++0x } + +int global_variable; + +template struct X { + static constexpr T r = global_variable; +}; + +X x; -- 2.30.2