From 6b4d174cd68a672fba3e30a51e65caf42fc16e0e Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 14 Apr 2014 21:00:40 +0000 Subject: [PATCH] PR19415: Converting 'constexpr' to 'const' in a non-static data member can fail if the member is already 'const'. Don't assert in that case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206205 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 21 +++++++++++++-------- test/FixIt/fixit-cxx0x.cpp | 3 ++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index fbc3fd7eb8..65705f5a55 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1960,14 +1960,19 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, Diag(DS.getConstexprSpecLoc(), diag::err_invalid_constexpr_member); SourceLocation ConstexprLoc = DS.getConstexprSpecLoc(); if (InitStyle == ICIS_NoInit) { - B << 0 << 0 << FixItHint::CreateReplacement(ConstexprLoc, "const"); - D.getMutableDeclSpec().ClearConstexprSpec(); - const char *PrevSpec; - unsigned DiagID; - bool Failed = D.getMutableDeclSpec().SetTypeQual(DeclSpec::TQ_const, ConstexprLoc, - PrevSpec, DiagID, getLangOpts()); - (void)Failed; - assert(!Failed && "Making a constexpr member const shouldn't fail"); + B << 0 << 0; + if (D.getDeclSpec().getTypeQualifiers() & DeclSpec::TQ_const) + B << FixItHint::CreateRemoval(ConstexprLoc); + else { + B << FixItHint::CreateReplacement(ConstexprLoc, "const"); + D.getMutableDeclSpec().ClearConstexprSpec(); + const char *PrevSpec; + unsigned DiagID; + bool Failed = D.getMutableDeclSpec().SetTypeQual( + DeclSpec::TQ_const, ConstexprLoc, PrevSpec, DiagID, getLangOpts()); + (void)Failed; + assert(!Failed && "Making a constexpr member const shouldn't fail"); + } } else { B << 1; const char *PrevSpec; diff --git a/test/FixIt/fixit-cxx0x.cpp b/test/FixIt/fixit-cxx0x.cpp index bfd8c3dcfe..5fe7ca4ea9 100644 --- a/test/FixIt/fixit-cxx0x.cpp +++ b/test/FixIt/fixit-cxx0x.cpp @@ -125,7 +125,8 @@ namespace NonStaticConstexpr { struct foo { constexpr int i; // expected-error {{non-static data member cannot be constexpr; did you intend to make it const?}} constexpr int j = 7; // expected-error {{non-static data member cannot be constexpr; did you intend to make it static?}} - foo() : i(3) { + constexpr const int k; // expected-error {{non-static data member cannot be constexpr; did you intend to make it const?}} + foo() : i(3), k(4) { } static int get_j() { return j; -- 2.40.0