From: Hans Wennborg Date: Wed, 22 Jul 2015 23:54:51 +0000 (+0000) Subject: Downgrade error about adding 'dllimport' to used free function to warning (PR24215) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=987bbbe4717ff722b97063cea9e30d2d3b04bd44;p=clang Downgrade error about adding 'dllimport' to used free function to warning (PR24215) The code will still work as it can reference the function via its thunk. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242973 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d25b4dda88..0eea0e689d 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -5368,10 +5368,9 @@ static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr; if (AddsAttr && !IsSpecialization && !OldDecl->isImplicit()) { - // If the declaration hasn't been used yet, allow with a warning for - // free functions and global variables. + // Allow with a warning for free functions and global variables. bool JustWarn = false; - if (!OldDecl->isUsed() && !OldDecl->isCXXClassMember()) { + if (!OldDecl->isCXXClassMember()) { auto *VD = dyn_cast(OldDecl); if (VD && !VD->getDescribedVarTemplate()) JustWarn = true; @@ -5380,6 +5379,13 @@ static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, JustWarn = true; } + // We cannot change a declaration that's been used because IR has already + // been emitted. Dllimported functions will still work though (modulo + // address equality) as they can use the thunk. + if (OldDecl->isUsed()) + if (!isa(OldDecl) || !NewImportAttr) + JustWarn = false; + unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration : diag::err_attribute_dll_redeclaration; S.Diag(NewDecl->getLocation(), DiagID) diff --git a/test/Sema/dllimport.c b/test/Sema/dllimport.c index 3ca1baa299..d81aecd604 100644 --- a/test/Sema/dllimport.c +++ b/test/Sema/dllimport.c @@ -143,7 +143,7 @@ __declspec(dllimport) void redecl3(); // expected-note{{previous declaration is void redecl4(); // expected-note{{previous declaration is here}} void useRedecl4() { redecl4(); } -__declspec(dllimport) void redecl4(); // expected-error{{redeclaration of 'redecl4' cannot add 'dllimport' attribute}} +__declspec(dllimport) void redecl4(); // expected-warning{{redeclaration of 'redecl4' should not add 'dllimport' attribute}} // Allow with a warning if the decl hasn't been used yet. void redecl5(); // expected-note{{previous declaration is here}}