From 6da9537811bd00e8f3c4bb2d4ea96232f771f73b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 14 Dec 2010 19:35:17 -0500 Subject: [PATCH] re PR c++/46930 ([C++0x] ICE with static constexpr data member) PR c++/46930 * decl.c (grokdeclarator): Reject uninitialized constexpr static data member. From-SVN: r167834 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 7 +++++++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C | 4 ++-- gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C | 4 ++-- 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9d8f04b5b30..142dd533ac72 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-12-14 Jason Merrill + + PR c++/46930 + * decl.c (grokdeclarator): Reject uninitialized constexpr + static data member. + 2010-12-14 Nathan Froyd PR c++/45330 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1be0f979b1e8..f9331bc14764 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9763,6 +9763,13 @@ grokdeclarator (const cp_declarator *declarator, if (thread_p) DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + + if (constexpr_p && !initialized) + { + error ("constexpr static data member %qD must have an " + "initializer", decl); + constexpr_p = false; + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f3210512f89d..60e48b39d0ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-14 Jason Merrill + + PR c++/46930 + * g++.dg/cpp0x/constexpr-decl.C: New. + * g++.dg/cpp0x/constexpr-ex1.C: Fix. + * g++.dg/cpp0x/constexpr-static5.C: Fix. + 2010-12-14 Jan Hubicka PR lto/46940 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C new file mode 100644 index 000000000000..0a3fcb656233 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C @@ -0,0 +1,10 @@ +// PR c++/46930 +// { dg-options -std=c++0x } + +struct S { + static constexpr int size; // { dg-error "must have an initializer" } + // { dg-error "previous declaration" "" { target *-*-* } 5 } +}; + +const int limit = 2 * S::size; +constexpr int S::size = 256; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C index c7757f475988..6b090a03f0f4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -16,9 +16,9 @@ struct S { constexpr int twice(); constexpr int t(); // { dg-message "used but never defined" } private: - static constexpr int val; // constexpr variable + static constexpr int val = 7; // constexpr variable }; -constexpr int S::val = 7; + constexpr int S::twice() { return val + val; } constexpr S s = { }; int x1 = s.twice(); // ok diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C index cb553a25fe8b..a401cc0b8901 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C @@ -3,10 +3,10 @@ template struct A { - constexpr static T t; + constexpr static T t = T(); // { dg-error "literal" } }; template -constexpr T A::t = T(); // { dg-error "not literal" } +constexpr T A::t; struct B {