From 0fe3f4d731e7d99e5287391af4519ee4a32cba43 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 9 Jan 2015 10:33:23 +0000 Subject: [PATCH] Sema: Don't crash when variable is redefined as a constexpr function We have a diagnostic describing that constexpr changed in C++14 when compiling in C++11 mode. While doing this, it examines the previous declaration and assumes that it is a function. However it is possible, in the context of error recovery, for this to not be the case. llvm-svn: 225518 --- clang/lib/Sema/SemaDecl.cpp | 2 +- clang/test/SemaCXX/constant-expression-cxx11.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 970b2ec..46cd285 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7885,7 +7885,7 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, (MD->getTypeQualifiers() & Qualifiers::Const) == 0) { CXXMethodDecl *OldMD = nullptr; if (OldDecl) - OldMD = dyn_cast(OldDecl->getAsFunction()); + OldMD = dyn_cast_or_null(OldDecl->getAsFunction()); if (!OldMD || !OldMD->isStatic()) { const FunctionProtoType *FPT = MD->getType()->castAs(); diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index d8f6f08..14c0ae3 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -1979,3 +1979,8 @@ namespace PR21859 { constexpr int Fun() { return; } // expected-error {{non-void constexpr function 'Fun' should return a value}} constexpr int Var = Fun(); // expected-error {{constexpr variable 'Var' must be initialized by a constant expression}} } + +struct InvalidRedef { + int f; // expected-note{{previous definition is here}} + constexpr int f(void); // expected-error{{redefinition of 'f'}} expected-warning{{will not be implicitly 'const'}} +}; -- 2.7.4