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