diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4637,8 +4637,10 @@ Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), llvm::PointerType::getUnqual(DeclTy), /*D=*/nullptr); - LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()), - D->getType().isConstQualified()); + if (const auto *VD = dyn_cast(GD.getDecl())) + LT = getLLVMLinkageVarDefinition(VD, D->getType().isConstQualified()); + else + LT = getFunctionLinkage(GD); } // Create the new alias itself, but don't set a name yet. diff --git a/clang/test/CodeGen/alias.c b/clang/test/CodeGen/alias.c --- a/clang/test/CodeGen/alias.c +++ b/clang/test/CodeGen/alias.c @@ -109,3 +109,9 @@ // CHECKGLOBALS: @test12_alias = alias void (), void ()* @test12 void test12(void) {} inline void test12_alias(void) __attribute__((gnu_inline, alias("test12"))); + +// Test that a non visible (-Wvisibility) type doesn't assert. +// CHECKGLOBALS: @test13_alias = alias {}, bitcast (void (i32)* @test13 to {}*) +enum a_type { test13_a }; +void test13(enum a_type y) {} +void test13_alias(enum undeclared_type y) __attribute__((alias ("test13")));