Skip to content

Commit a7521fd

Browse files
committed
[clang][Interp] Implement __builtin_sycl_unique_stable_name
1 parent 6ff8236 commit a7521fd

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,6 +1594,30 @@ bool ByteCodeExprGen<Emitter>::VisitStringLiteral(const StringLiteral *E) {
15941594
return true;
15951595
}
15961596

1597+
template <class Emitter>
1598+
bool ByteCodeExprGen<Emitter>::VisitSYCLUniqueStableNameExpr(
1599+
const SYCLUniqueStableNameExpr *E) {
1600+
if (DiscardResult)
1601+
return true;
1602+
1603+
assert(!Initializing);
1604+
1605+
auto &A = Ctx.getASTContext();
1606+
std::string ResultStr = E->ComputeName(A);
1607+
1608+
QualType CharTy = A.CharTy.withConst();
1609+
APInt Size(A.getTypeSize(A.getSizeType()), ResultStr.size() + 1);
1610+
QualType ArrayTy = A.getConstantArrayType(CharTy, Size, nullptr,
1611+
ArraySizeModifier::Normal, 0);
1612+
1613+
StringLiteral *SL =
1614+
StringLiteral::Create(A, ResultStr, StringLiteralKind::Ordinary,
1615+
/*Pascal=*/false, ArrayTy, E->getLocation());
1616+
1617+
unsigned StringIndex = P.createGlobalString(SL);
1618+
return this->emitGetPtrGlobal(StringIndex, E);
1619+
}
1620+
15971621
template <class Emitter>
15981622
bool ByteCodeExprGen<Emitter>::VisitCharacterLiteral(
15991623
const CharacterLiteral *E) {

clang/lib/AST/Interp/ByteCodeExprGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
9090
bool VisitOpaqueValueExpr(const OpaqueValueExpr *E);
9191
bool VisitAbstractConditionalOperator(const AbstractConditionalOperator *E);
9292
bool VisitStringLiteral(const StringLiteral *E);
93+
bool VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E);
9394
bool VisitCharacterLiteral(const CharacterLiteral *E);
9495
bool VisitCompoundAssignOperator(const CompoundAssignOperator *E);
9596
bool VisitFloatCompoundAssignOperator(const CompoundAssignOperator *E);

clang/test/AST/Interp/sycl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clang_cc1 %s -std=c++17 -triple x86_64-linux-gnu -fsycl-is-device -verify=both,ref -fsyntax-only -Wno-unused
2+
// RUN: %clang_cc1 %s -std=c++17 -triple x86_64-linux-gnu -fsycl-is-device -verify=both,expected -fsyntax-only -Wno-unused -fexperimental-new-constant-interpreter
3+
4+
// both-no-diagnostics
5+
6+
constexpr int a = 0;
7+
constexpr const char *a_name = __builtin_sycl_unique_stable_name(decltype(a));
8+
static_assert(__builtin_strcmp(a_name, "_ZTSKi") == 0);
9+

0 commit comments

Comments
 (0)