Commit dc75a9da authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r242973:

------------------------------------------------------------------------
r242973 | hans | 2015-07-22 16:54:51 -0700 (Wed, 22 Jul 2015) | 3 lines

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.
------------------------------------------------------------------------

llvm-svn: 243320
parent 719f7b1f
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -5381,10 +5381,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<VarDecl>(OldDecl);
      if (VD && !VD->getDescribedVarTemplate())
        JustWarn = true;
@@ -5393,6 +5392,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<FunctionDecl>(OldDecl) || !NewImportAttr)
        JustWarn = false;
    unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
                               : diag::err_attribute_dll_redeclaration;
    S.Diag(NewDecl->getLocation(), DiagID)
+1 −1
Original line number Diff line number Diff line
@@ -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}}