Files
clang-p2996/clang/test/CodeGen/ms-declspecs.c
Nico Weber 608e768d8d Don't crash when a selectany symbol would get common linkage
Things can't both be in comdats and have common linkage, so never give things
in comdats common linkage. Common linkage is only used in .c files, and the
only thing that can trigger a comdat in c is selectany from what I can tell.
Fixes PR23243.

Also address an over-the-shoulder review comment from rnk by moving the
hasAttr<SelectAnyAttr>() in Decl.cpp around a bit. It only makes a minor
difference for selectany on global variables, so it goes well with the rest of
this patch.

http://reviews.llvm.org/D9042

llvm-svn: 235053
2015-04-15 23:04:24 +00:00

40 lines
1.2 KiB
C

// RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s
__declspec(selectany) int x1 = 1;
const __declspec(selectany) int x2 = 2;
// CHECK: @x1 = weak_odr global i32 1, comdat, align 4
// CHECK: @x2 = weak_odr constant i32 2, comdat, align 4
// selectany turns extern variable declarations into definitions.
__declspec(selectany) int x3;
extern __declspec(selectany) int x4;
// CHECK: @x3 = weak_odr global i32 0, comdat, align 4
// CHECK: @x4 = weak_odr global i32 0, comdat, align 4
struct __declspec(align(16)) S {
char x;
};
union { struct S s; } u;
// CHECK: @u = {{.*}}zeroinitializer, align 16
// CHECK: define void @t3() [[NAKED:#[0-9]+]] {
__declspec(naked) void t3() {}
// CHECK: define void @t22() [[NUW:#[0-9]+]]
void __declspec(nothrow) t22();
void t22() {}
// CHECK: define void @t2() [[NI:#[0-9]+]] {
__declspec(noinline) void t2() {}
// CHECK: call void @f20_t() [[NR:#[0-9]+]]
__declspec(noreturn) void f20_t(void);
void f20(void) { f20_t(); }
// CHECK: attributes [[NAKED]] = { naked noinline nounwind{{.*}} }
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
// CHECK: attributes [[NI]] = { noinline nounwind{{.*}} }
// CHECK: attributes [[NR]] = { noreturn }