Skip to content

Commit 4f16651

Browse files
authored
[CIR] Upstream support for variable template specializations (#151069)
1 parent 3ffaaf6 commit 4f16651

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenModule.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,8 @@ void CIRGenModule::emitTopLevelDecl(Decl *decl) {
13071307
}
13081308

13091309
case Decl::Var:
1310-
case Decl::Decomposition: {
1310+
case Decl::Decomposition:
1311+
case Decl::VarTemplateSpecialization: {
13111312
auto *vd = cast<VarDecl>(decl);
13121313
if (isa<DecompositionDecl>(decl)) {
13131314
errorNYI(decl->getSourceRange(), "global variable decompositions");
@@ -1342,6 +1343,8 @@ void CIRGenModule::emitTopLevelDecl(Decl *decl) {
13421343
case Decl::StaticAssert:
13431344
case Decl::TypeAliasTemplate:
13441345
case Decl::UsingShadow:
1346+
case Decl::VarTemplate:
1347+
case Decl::VarTemplatePartialSpecialization:
13451348
break;
13461349

13471350
case Decl::CXXConstructor:
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %clang_cc1 -std=c++14 -triple nvptx64-unknown-unknown -fclangir -emit-cir %s -o %t.cir
2+
// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s
3+
// RUN: %clang_cc1 -std=c++14 -triple nvptx64-unknown-unknown -fclangir -emit-llvm %s -o %t-cir.ll
4+
// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s
5+
// RUN: %clang_cc1 -std=c++14 -triple nvptx64-unknown-unknown -emit-llvm %s -o %t.ll
6+
// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s
7+
8+
struct some_struct {
9+
int x;
10+
};
11+
12+
template<int I>
13+
int var_template;
14+
15+
template<> int var_template<0>;
16+
template<> int var_template<1> = 1;
17+
template<> some_struct var_template<2>;
18+
19+
// CIR: !rec_some_struct = !cir.record<struct "some_struct" {!s32i}>
20+
// CIR: cir.global external @_Z12var_templateILi0EE = #cir.int<0> : !s32i
21+
// CIR: cir.global external @_Z12var_templateILi1EE = #cir.int<1> : !s32i
22+
// CIR: cir.global external @_Z12var_templateILi2EE = #cir.zero : !rec_some_struct
23+
24+
// LLVM: %[[STRUCT_TYPE:.+]] = type { i32 }
25+
// LLVM: @_Z12var_templateILi0EE = global i32 0
26+
// LLVM: @_Z12var_templateILi1EE = global i32 1
27+
// LLVM: @_Z12var_templateILi2EE = global %[[STRUCT_TYPE]] zeroinitializer
28+
29+
// OGCG: %[[STRUCT_TYPE:.+]] = type { i32 }
30+
// OGCG: @_Z12var_templateILi0EE = global i32 0
31+
// OGCG: @_Z12var_templateILi1EE = global i32 1
32+
// OGCG: @_Z12var_templateILi2EE = global %[[STRUCT_TYPE]] zeroinitializer
33+
34+
template<typename T, int I> int partial_var_template_specialization_shouldnt_hit_codegen;
35+
template<typename T> int partial_var_template_specialization_shouldnt_hit_codegen<T, 123>;
36+
template<int I> float partial_var_template_specialization_shouldnt_hit_codegen<float, I>;
37+
38+
// CIR-NOT: partial_var_template_specialization_shouldnt_hit_codegen
39+
// LLVM-NOT: partial_var_template_specialization_shouldnt_hit_codegen
40+
// OGCG-NOT: partial_var_template_specialization_shouldnt_hit_codegen

0 commit comments

Comments
 (0)