xref: /llvm-project/clang/test/CodeGenCUDA/constexpr-variables.cu (revision 45f2a56856e29b8cb038b2e559289b91fb98fedf)
1049d8607SYaxun (Sam) Liu // RUN: %clang_cc1 -std=c++14 %s -emit-llvm -o - -triple nvptx \
2049d8607SYaxun (Sam) Liu // RUN:   -fcuda-is-device | FileCheck --check-prefixes=CXX14 %s
3049d8607SYaxun (Sam) Liu // RUN: %clang_cc1 -std=c++17 %s -emit-llvm -o - -triple nvptx \
4049d8607SYaxun (Sam) Liu // RUN:   -fcuda-is-device | FileCheck --check-prefixes=CXX17 %s
5049d8607SYaxun (Sam) Liu 
6049d8607SYaxun (Sam) Liu #include "Inputs/cuda.h"
7049d8607SYaxun (Sam) Liu 
8049d8607SYaxun (Sam) Liu // COM: @_ZL1a = internal {{.*}}constant i32 7
9049d8607SYaxun (Sam) Liu constexpr int a = 7;
10049d8607SYaxun (Sam) Liu __constant__ const int &use_a = a;
11049d8607SYaxun (Sam) Liu 
12049d8607SYaxun (Sam) Liu namespace B {
13049d8607SYaxun (Sam) Liu  // COM: @_ZN1BL1bE = internal {{.*}}constant i32 9
14049d8607SYaxun (Sam) Liu   constexpr int b = 9;
15049d8607SYaxun (Sam) Liu }
16049d8607SYaxun (Sam) Liu __constant__ const int &use_B_b = B::b;
17049d8607SYaxun (Sam) Liu 
18049d8607SYaxun (Sam) Liu struct Q {
19049d8607SYaxun (Sam) Liu   // CXX14: @_ZN1Q2k2E = {{.*}}externally_initialized constant i32 6
20049d8607SYaxun (Sam) Liu   // CXX17: @_ZN1Q2k2E = internal {{.*}}constant i32 6
21049d8607SYaxun (Sam) Liu   // CXX14: @_ZN1Q2k1E = available_externally {{.*}}constant i32 5
22*45f2a568SYaxun (Sam) Liu   // CXX17: @_ZN1Q2k1E = {{.*}} externally_initialized constant i32 5
23049d8607SYaxun (Sam) Liu   static constexpr int k1 = 5;
24049d8607SYaxun (Sam) Liu   static constexpr int k2 = 6;
25049d8607SYaxun (Sam) Liu };
26049d8607SYaxun (Sam) Liu constexpr int Q::k2;
27049d8607SYaxun (Sam) Liu 
28049d8607SYaxun (Sam) Liu __constant__ const int &use_Q_k1 = Q::k1;
29049d8607SYaxun (Sam) Liu __constant__ const int &use_Q_k2 = Q::k2;
30049d8607SYaxun (Sam) Liu 
31049d8607SYaxun (Sam) Liu template<typename T> struct X {
32049d8607SYaxun (Sam) Liu   // CXX14: @_ZN1XIiE1aE = available_externally {{.*}}constant i32 123
33*45f2a568SYaxun (Sam) Liu   // CXX17: @_ZN1XIiE1aE = {{.*}}externally_initialized constant i32 123
34049d8607SYaxun (Sam) Liu   static constexpr int a = 123;
35049d8607SYaxun (Sam) Liu };
36049d8607SYaxun (Sam) Liu __constant__ const int &use_X_a = X<int>::a;
37049d8607SYaxun (Sam) Liu 
38049d8607SYaxun (Sam) Liu template <typename T, T a, T b> struct A {
39049d8607SYaxun (Sam) Liu   // CXX14: @_ZN1AIiLi1ELi2EE1xE = available_externally {{.*}}constant i32 2
40*45f2a568SYaxun (Sam) Liu   // CXX17: @_ZN1AIiLi1ELi2EE1xE = {{.*}}externally_initialized constant i32 2
41049d8607SYaxun (Sam) Liu   constexpr static T x = a * b;
42049d8607SYaxun (Sam) Liu };
43049d8607SYaxun (Sam) Liu __constant__ const int &y = A<int, 1, 2>::x;
44