diff options
author | Richard Trieu <rtrieu@google.com> | 2014-08-22 01:16:44 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2014-08-22 01:16:44 +0000 |
commit | f98341ea4fdce4d41881bd40a31be038d574bc1c (patch) | |
tree | aae83e3dba7928ec2a1053668c954766fa50399d | |
parent | 5711df44b8bdc723934f49f97ea53d1d5e2e16a9 (diff) | |
download | bcm5719-llvm-f98341ea4fdce4d41881bd40a31be038d574bc1c.tar.gz bcm5719-llvm-f98341ea4fdce4d41881bd40a31be038d574bc1c.zip |
Fix PR20705, crash on invalid.
dyn_cast -> dyn_cast_or_null to handle a null pointer.
llvm-svn: 216254
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/PR20705.cpp | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index c8c381518b1..0244d4c4a30 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -9300,7 +9300,7 @@ Sema::FinalizeDeclaration(Decl *ThisDecl) { // Static locals inherit dll attributes from their function. if (VD->isStaticLocal()) { if (FunctionDecl *FD = - dyn_cast<FunctionDecl>(VD->getParentFunctionOrMethod())) { + dyn_cast_or_null<FunctionDecl>(VD->getParentFunctionOrMethod())) { if (Attr *A = getDLLAttr(FD)) { auto *NewAttr = cast<InheritableAttr>(A->clone(getASTContext())); NewAttr->setInherited(true); diff --git a/clang/test/SemaCXX/PR20705.cpp b/clang/test/SemaCXX/PR20705.cpp new file mode 100644 index 00000000000..be2676e5635 --- /dev/null +++ b/clang/test/SemaCXX/PR20705.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s + +template <typename T> +struct X {}; +auto b = []() { + struct S { + static typename X<decltype(int)>::type Run(){}; + // expected-error@-1 4{{}} + }; + return 5; +}(); + +template <typename T1, typename T2> +class PC { +}; + +template <typename T> +class P { + static typename PC<T, Invalid>::Type Foo(); + // expected-error@-1 4{{}} +}; |