wanders created this revision.
wanders added a reviewer: aaron.ballman.
Herald added a project: All.
wanders requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This adds tests checking the behavior of const variables declared with
weak attribute.

Both checking that they can not be used in places where a constant
expression is required and that a dynamic initializer is emitted when
used as an initializer expression.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D126578

Files:
  clang/test/CodeGenCXX/weak-init.cpp
  clang/test/SemaCXX/weak-init.cpp


Index: clang/test/SemaCXX/weak-init.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/weak-init.cpp
@@ -0,0 +1,17 @@
+// 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}}
Index: clang/test/CodeGenCXX/weak-init.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenCXX/weak-init.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -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;


Index: clang/test/SemaCXX/weak-init.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/weak-init.cpp
@@ -0,0 +1,17 @@
+// 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}}
Index: clang/test/CodeGenCXX/weak-init.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenCXX/weak-init.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -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;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to