Index: lib/CodeGen/CodeGenModule.cpp =================================================================== --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -694,6 +694,8 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D, ForDefinition_t IsForDefinition) const { + if (GV->hasDLLImportStorageClass()) + return; // Internal definitions always have default visibility. if (GV->hasLocalLinkage()) { GV->setVisibility(llvm::GlobalValue::DefaultVisibility); Index: test/CodeGenCXX/hidden-dllimport.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/hidden-dllimport.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -emit-llvm -fvisibility-inlines-hidden -o - %s | FileCheck %s + +// We used to declare this hidden dllimport, which is contradictory. + +// CHECK: declare dllimport void @"\01?bar@foo@@QEAAXXZ"(%struct.foo*) + +struct __attribute__((dllimport)) foo { + void bar() {} +}; +void zed(foo *p) { p->bar(); }