From 3645cf99f234e9d2c03014551027e2c47e1d2c1e Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 29 Jan 2013 21:40:37 +0000 Subject: [PATCH] Don't fixit/recover from -Wstatic-float-init when it's not an error. Fix to change r173414 that lead to Clang changing const to constexpr even under -Wno-static-float-init. llvm-svn: 173835 --- clang/lib/Sema/SemaDecl.cpp | 14 +++++++++----- clang/test/SemaCXX/cxx0x-class.cpp | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 33506401cfe8..702d38280a6c 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7203,11 +7203,15 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, // In C++98, this is a GNU extension. In C++11, it is not, but we support // it anyway and provide a fixit to add the 'constexpr'. if (getLangOpts().CPlusPlus11) { - Diag(VDecl->getLocation(), - diag::ext_in_class_initializer_float_type_cxx11) - << DclT << Init->getSourceRange() - << FixItHint::CreateInsertion(VDecl->getLocStart(), "constexpr "); - VDecl->setConstexpr(true); + SemaDiagnosticBuilder D = Diag(VDecl->getLocation(), + diag::ext_in_class_initializer_float_type_cxx11); + D << DclT << Init->getSourceRange(); + if (Diags.getDiagnosticLevel(diag::warn_initializer_out_of_order, + VDecl->getLocation()) >= + DiagnosticsEngine::Error) { + D << FixItHint::CreateInsertion(VDecl->getLocStart(), "constexpr "); + VDecl->setConstexpr(true); + } } else { Diag(VDecl->getLocation(), diag::ext_in_class_initializer_float_type) << DclT << Init->getSourceRange(); diff --git a/clang/test/SemaCXX/cxx0x-class.cpp b/clang/test/SemaCXX/cxx0x-class.cpp index 5532bcea3eb9..4e0d5bc3d702 100644 --- a/clang/test/SemaCXX/cxx0x-class.cpp +++ b/clang/test/SemaCXX/cxx0x-class.cpp @@ -17,11 +17,11 @@ public: }; namespace rdar8367341 { - float foo(); // expected-note 2{{here}} + float foo(); // expected-note {{here}} struct A { static const float x = 5.0f; // expected-warning {{requires 'constexpr'}} - static const float y = foo(); // expected-warning {{requires 'constexpr'}} expected-error {{constexpr variable 'y' must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo'}} + static const float y = foo(); // expected-warning {{requires 'constexpr'}} static constexpr float x2 = 5.0f; static constexpr float y2 = foo(); // expected-error {{must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo'}} }; -- 2.34.1