diff --git a/clang/test/CodeGenCXX/weak-init.cpp b/clang/test/CodeGenCXX/weak-init.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/weak-init.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s + +extern const int W __attribute__((weak)) = 99; +const int S = 77; + +// CHECK: @C1 = {{.*}} 77 +extern const int C1 = S; + +// CHECK: %0 = load {{.*}} @W +// CHECK-NEXT: store {{.*}} %0, {{.*}} @C2 +extern const int C2 = W; diff --git a/clang/test/SemaCXX/weak-init.cpp b/clang/test/SemaCXX/weak-init.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/weak-init.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +extern const int W1 __attribute__((weak)) = 10; // expected-note {{declared here}} + +static_assert(W1 == 10, ""); // expected-error {{static_assert expression is not an integral constant expression}} + // expected-note@-1 {{initializer of weak variable 'W1' is not considered constant because it may be different at runtime}} + +extern const int W2 __attribute__((weak)) = 20; + +int S2[W2]; // expected-error {{variable length array declaration not allowed at file scope}} + +extern const int W3 __attribute__((weak)) = 30; // expected-note {{declared here}} + +constexpr int S3 = W3; // expected-error {{constexpr variable 'S3' must be initialized by a constant expression}} + // expected-note@-1 {{initializer of weak variable 'W3' is not considered constant because it may be different at runtime}}