diff options
author | Hans Wennborg <hans@hanshq.net> | 2016-11-29 22:31:00 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2016-11-29 22:31:00 +0000 |
commit | a6714922d100fc9ca90cfc4dc4bb0df875206197 (patch) | |
tree | 7c786e1d9e0de7f849435a2542e38ca715bcc63a | |
parent | 47f7f30df9eced812c16f07acd5979ab2a14cd7c (diff) | |
download | bcm5719-llvm-a6714922d100fc9ca90cfc4dc4bb0df875206197.tar.gz bcm5719-llvm-a6714922d100fc9ca90cfc4dc4bb0df875206197.zip |
Don't try to merge DLL attributes on redeclaration of invalid decl (PR31069)
llvm-svn: 288207
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 3 | ||||
-rw-r--r-- | clang/test/Sema/dllimport.c | 4 |
2 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 58776e8705b..e8764a0edf5 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5651,6 +5651,9 @@ static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition) { + if(OldDecl->isInvalidDecl()) + return; + if (TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) { OldDecl = OldTD->getTemplatedDecl(); if (!IsSpecialization) diff --git a/clang/test/Sema/dllimport.c b/clang/test/Sema/dllimport.c index 0728cf14a8e..a7fb00e3f77 100644 --- a/clang/test/Sema/dllimport.c +++ b/clang/test/Sema/dllimport.c @@ -210,6 +210,10 @@ __declspec(dllimport) void redecl6(); void redecl7(); __declspec(dllimport) inline void redecl7() {} +// PR31069: Don't crash trying to merge attributes for redeclaration of invalid decl. +void __declspec(dllimport) redecl8(unknowntype X); // expected-error{{unknown type name 'unknowntype'}} +void redecl8(unknowntype X) { } // expected-error{{unknown type name 'unknowntype'}} + // External linkage is required. __declspec(dllimport) static int staticFunc(); // expected-error{{'staticFunc' must have external linkage when declared 'dllimport'}} |