aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-07-25 10:57:06 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-07-25 10:57:06 -0400
commit452ed9e73bfdc6b08003cd0f79c8df8bd7af5b1d (patch)
tree91d7df58abad71242d425eb5c528ecae150c113f
parent9155a6ddc40af0eed7079eac318e6dd864dcdbc9 (diff)
downloadgcc-452ed9e73bfdc6b08003cd0f79c8df8bd7af5b1d.zip
gcc-452ed9e73bfdc6b08003cd0f79c8df8bd7af5b1d.tar.gz
gcc-452ed9e73bfdc6b08003cd0f79c8df8bd7af5b1d.tar.bz2
re PR c++/54086 (GCC should allow constexpr and const together)
PR c++/54086 * decl.c (grokdeclarator): Allow const and constexpr together. From-SVN: r189852
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C3
4 files changed, 11 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f5fbb5c..409e64d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2012-07-25 Jason Merrill <jason@redhat.com>
+ PR c++/54086
+ * decl.c (grokdeclarator): Allow const and constexpr together.
+
PR c++/54020
* semantics.c (potential_constant_expression_1) [COND_EXPR]: Call
maybe_constant_value.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index c37787b..047b2fe 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9528,8 +9528,6 @@ grokdeclarator (const cp_declarator *declarator,
the object as `const'. */
if (constexpr_p && innermost_code != cdk_function)
{
- if (type_quals & TYPE_QUAL_CONST)
- error ("both %<const%> and %<constexpr%> cannot be used here");
if (type_quals & TYPE_QUAL_VOLATILE)
error ("both %<volatile%> and %<constexpr%> cannot be used here");
if (TREE_CODE (type) != REFERENCE_TYPE)
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C
new file mode 100644
index 0000000..6ee7225
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C
@@ -0,0 +1,7 @@
+// PR c++/54086
+// { dg-do compile { target c++11 } }
+
+static constexpr const char Data[] = {
+ 'D', 'A', 'T', 'A',
+};
+static constexpr const char *data_func() { return Data; }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
index 4ff398b..6c9d466 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
@@ -18,8 +18,7 @@ extern constexpr int i2; // { dg-error "definition" }
// error: missing initializer
constexpr A1 a2; // { dg-error "uninitialized const" }
-// error: duplicate cv
-const constexpr A1 a3 = A1(); // { dg-error "both .const. and .constexpr. cannot" }
+const constexpr A1 a3 = A1();
volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" }