diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C | 4 |
6 files changed, 34 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9d8f04b5b3..142dd533ac7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-12-14 Jason Merrill <jason@redhat.com> + + PR c++/46930 + * decl.c (grokdeclarator): Reject uninitialized constexpr + static data member. + 2010-12-14 Nathan Froyd <froydnj@codesourcery.com> PR c++/45330 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1be0f979b1e..f9331bc1476 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 f3210512f89..60e48b39d0c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-14 Jason Merrill <jason@redhat.com> + + 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 <jh@suse.cz> 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 00000000000..0a3fcb65623 --- /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 c7757f47598..6b090a03f0f 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 cb553a25fe8..a401cc0b890 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C @@ -3,10 +3,10 @@ template <class T> struct A { - constexpr static T t; + constexpr static T t = T(); // { dg-error "literal" } }; template <class T> -constexpr T A<T>::t = T(); // { dg-error "not literal" } +constexpr T A<T>::t; struct B { |