[Clang][CodeGen] fix failed assertion
authorNick Desaulniers <ndesaulniers@google.com>
Mon, 26 Oct 2020 18:25:23 +0000 (11:25 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Mon, 26 Oct 2020 18:37:55 +0000 (11:37 -0700)
Ensure we can emit symbol aliases via function attribute
even when function signatures contain incomplete types.

Via bugreport:
https://reviews.llvm.org/D66492#2350947

Reviewed By: erichkeane

Differential Revision: https://reviews.llvm.org/D90073

clang/lib/CodeGen/CodeGenModule.cpp
clang/test/CodeGen/alias.c

index fd13321..2a7fb4f 100644 (file)
@@ -4684,8 +4684,10 @@ void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
                                     llvm::PointerType::getUnqual(DeclTy),
                                     /*D=*/nullptr);
-    LT = getLLVMLinkageVarDefinition(cast<VarDecl>(GD.getDecl()),
-                                     D->getType().isConstQualified());
+    if (const auto *VD = dyn_cast<VarDecl>(GD.getDecl()))
+      LT = getLLVMLinkageVarDefinition(VD, D->getType().isConstQualified());
+    else
+      LT = getFunctionLinkage(GD);
   }
 
   // Create the new alias itself, but don't set a name yet.
index 21483cf..41939cb 100644 (file)
@@ -109,3 +109,9 @@ static void test11_foo(void) __attribute__((alias("test11")));
 // 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")));