The PR points out DR 1688: volatile + constexpr is a valid combination. This patch makes the compiler accept such a code.
There's a related problem: constexpr volatile int a = 42; constexpr int b = a; the initialization of b should be rejected, but it is not. My patch does not address this issue though. Bootstrapped/regtested on x86_64-linux, ok for trunk? If so, should this be backported to 4.8/4.9? 2015-03-16 Marek Polacek <pola...@redhat.com> DR 1688 PR c++/65327 * decl.c (grokdeclarator): Allow volatile and constexpr together. * g++.dg/cpp0x/constexpr-object1.C: Change dg-error to dg-bogus. * g++.dg/cpp0x/pr65327.C: New test. diff --git gcc/cp/decl.c gcc/cp/decl.c index e35e484..cb0f11f 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -10134,8 +10134,9 @@ grokdeclarator (const cp_declarator *declarator, the object as `const'. */ if (constexpr_p && innermost_code != cdk_function) { - if (type_quals & TYPE_QUAL_VOLATILE) - error ("both %<volatile%> and %<constexpr%> cannot be used here"); + /* DR1688 says that a `constexpr' specifier in combination with + `volatile' is valid. */ + if (TREE_CODE (type) != REFERENCE_TYPE) { type_quals |= TYPE_QUAL_CONST; diff --git gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C index 41afbe9..287c3ac 100644 --- gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C +++ gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C @@ -19,7 +19,7 @@ constexpr A1 a2; // { dg-error "uninitialized const" } const constexpr A1 a3 = A1(); -volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" } +volatile constexpr A1 a4 = A1(); // { dg-bogus "both .volatile. and .constexpr. cannot" } // error: on type declaration constexpr struct pixel diff --git gcc/testsuite/g++.dg/cpp0x/pr65327.C gcc/testsuite/g++.dg/cpp0x/pr65327.C index e69de29..c6cefab 100644 --- gcc/testsuite/g++.dg/cpp0x/pr65327.C +++ gcc/testsuite/g++.dg/cpp0x/pr65327.C @@ -0,0 +1,18 @@ +// PR c++/65327 +// { dg-do compile { target c++11 } } +// DR1688 says that constexpr can be used together with volatile. + +constexpr volatile int i = 10; + +void +foo () +{ + constexpr volatile int j = 5; + static constexpr volatile int k = 5; +} + +constexpr volatile int +bar () +{ + return i; +} Marek