aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-12-14 19:35:17 -0500
committerJason Merrill <jason@gcc.gnu.org>2010-12-14 19:35:17 -0500
commit6da9537811bd00e8f3c4bb2d4ea96232f771f73b (patch)
treec7b616b8619dbd2d29d3dcbbea448a2d19cb7b19
parentece17375aa807e5d77244c1584c8447af9e9afae (diff)
downloadgcc-6da9537811bd00e8f3c4bb2d4ea96232f771f73b.zip
gcc-6da9537811bd00e8f3c4bb2d4ea96232f771f73b.tar.gz
gcc-6da9537811bd00e8f3c4bb2d4ea96232f771f73b.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C4
6 files changed, 34 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d9d8f04..142dd53 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 1be0f97..f9331bc 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 f321051..60e48b3 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 0000000..0a3fcb6
--- /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 c7757f4..6b090a0 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 cb553a2..a401cc0 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
{