xref: /llvm-project/clang/test/CodeGenCUDA/constexpr-variables.cu (revision 45f2a56856e29b8cb038b2e559289b91fb98fedf)
1 // RUN: %clang_cc1 -std=c++14 %s -emit-llvm -o - -triple nvptx \
2 // RUN:   -fcuda-is-device | FileCheck --check-prefixes=CXX14 %s
3 // RUN: %clang_cc1 -std=c++17 %s -emit-llvm -o - -triple nvptx \
4 // RUN:   -fcuda-is-device | FileCheck --check-prefixes=CXX17 %s
5 
6 #include "Inputs/cuda.h"
7 
8 // COM: @_ZL1a = internal {{.*}}constant i32 7
9 constexpr int a = 7;
10 __constant__ const int &use_a = a;
11 
12 namespace B {
13  // COM: @_ZN1BL1bE = internal {{.*}}constant i32 9
14   constexpr int b = 9;
15 }
16 __constant__ const int &use_B_b = B::b;
17 
18 struct Q {
19   // CXX14: @_ZN1Q2k2E = {{.*}}externally_initialized constant i32 6
20   // CXX17: @_ZN1Q2k2E = internal {{.*}}constant i32 6
21   // CXX14: @_ZN1Q2k1E = available_externally {{.*}}constant i32 5
22   // CXX17: @_ZN1Q2k1E = {{.*}} externally_initialized constant i32 5
23   static constexpr int k1 = 5;
24   static constexpr int k2 = 6;
25 };
26 constexpr int Q::k2;
27 
28 __constant__ const int &use_Q_k1 = Q::k1;
29 __constant__ const int &use_Q_k2 = Q::k2;
30 
31 template<typename T> struct X {
32   // CXX14: @_ZN1XIiE1aE = available_externally {{.*}}constant i32 123
33   // CXX17: @_ZN1XIiE1aE = {{.*}}externally_initialized constant i32 123
34   static constexpr int a = 123;
35 };
36 __constant__ const int &use_X_a = X<int>::a;
37 
38 template <typename T, T a, T b> struct A {
39   // CXX14: @_ZN1AIiLi1ELi2EE1xE = available_externally {{.*}}constant i32 2
40   // CXX17: @_ZN1AIiLi1ELi2EE1xE = {{.*}}externally_initialized constant i32 2
41   constexpr static T x = a * b;
42 };
43 __constant__ const int &y = A<int, 1, 2>::x;
44