From b9c9b15c8afa410b8b44fec73dc094df89f86cb3 Mon Sep 17 00:00:00 2001 From: "Podchishchaeva, Mariya" Date: Wed, 5 Nov 2025 03:03:40 -0800 Subject: [PATCH 1/2] [clang][SYCL] Fix field/base builtins for PCH support We have added several builtins for device copyability checking a while back. These are implemented via new AST nodes, so they require implementation of ASTReaderStmt's and ASTWriterStmt's methods. The implementation was in place but it was untested so we never saw that it is missing reading of the builtin expression's type which resulted in crashes during PCH reading. --- clang/lib/Serialization/ASTReaderStmt.cpp | 4 ++++ clang/lib/Serialization/ASTWriterStmt.cpp | 4 ++++ clang/test/SemaSYCL/builtin-fields-pch.cpp | 26 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 clang/test/SemaSYCL/builtin-fields-pch.cpp diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 8a53543af17ee..57ae98f3229ee 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -1862,22 +1862,26 @@ void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) { } void ASTStmtReader::VisitSYCLBuiltinNumFieldsExpr(SYCLBuiltinNumFieldsExpr *E) { + VisitExpr(E); E->setLocation(readSourceLocation()); E->SourceTy = Record.readType(); } void ASTStmtReader::VisitSYCLBuiltinFieldTypeExpr(SYCLBuiltinFieldTypeExpr *E) { + VisitExpr(E); E->setLocation(readSourceLocation()); E->SourceTy = Record.readType(); E->Index = Record.readExpr(); } void ASTStmtReader::VisitSYCLBuiltinNumBasesExpr(SYCLBuiltinNumBasesExpr *E) { + VisitExpr(E); E->setLocation(readSourceLocation()); E->SourceTy = Record.readType(); } void ASTStmtReader::VisitSYCLBuiltinBaseTypeExpr(SYCLBuiltinBaseTypeExpr *E) { + VisitExpr(E); E->setLocation(readSourceLocation()); E->SourceTy = Record.readType(); E->Index = Record.readExpr(); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index d6c2b14a5460e..aeab34c2a4417 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1863,12 +1863,14 @@ void ASTStmtWriter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) { } void ASTStmtWriter::VisitSYCLBuiltinNumFieldsExpr(SYCLBuiltinNumFieldsExpr *E) { + VisitExpr(E); Record.AddSourceLocation(E->getLocation()); Record.AddTypeRef(E->getSourceType()); Code = serialization::EXPR_SYCL_BUILTIN_NUM_FIELDS; } void ASTStmtWriter::VisitSYCLBuiltinFieldTypeExpr(SYCLBuiltinFieldTypeExpr *E) { + VisitExpr(E); Record.AddSourceLocation(E->getLocation()); Record.AddTypeRef(E->getSourceType()); Record.AddStmt(E->getIndex()); @@ -1876,12 +1878,14 @@ void ASTStmtWriter::VisitSYCLBuiltinFieldTypeExpr(SYCLBuiltinFieldTypeExpr *E) { } void ASTStmtWriter::VisitSYCLBuiltinNumBasesExpr(SYCLBuiltinNumBasesExpr *E) { + VisitExpr(E); Record.AddSourceLocation(E->getLocation()); Record.AddTypeRef(E->getSourceType()); Code = serialization::EXPR_SYCL_BUILTIN_NUM_BASES; } void ASTStmtWriter::VisitSYCLBuiltinBaseTypeExpr(SYCLBuiltinBaseTypeExpr *E) { + VisitExpr(E); Record.AddSourceLocation(E->getLocation()); Record.AddTypeRef(E->getSourceType()); Record.AddStmt(E->getIndex()); diff --git a/clang/test/SemaSYCL/builtin-fields-pch.cpp b/clang/test/SemaSYCL/builtin-fields-pch.cpp new file mode 100644 index 0000000000000..63739b6a43e72 --- /dev/null +++ b/clang/test/SemaSYCL/builtin-fields-pch.cpp @@ -0,0 +1,26 @@ +// Test that __builtin_num_fields, __builtin_num_bases, __builtin_field_type, +// and __builtin_base_type work correctly with PCH. + +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: %clang_cc1 -std=c++17 -triple spir64-unknown-unknown -fsycl-is-device -emit-pch -x c++-header \ +// RUN: %t/pch.h -o %t/pch.h.device.pch +// RUN: %clang_cc1 -std=c++17 -triple spir64-unknown-unknown -fsycl-is-device -verify \ +// RUN: -include-pch %t/pch.h.device.pch %t/test.cpp + +#--- pch.h +struct Base {}; +template struct X { + static_assert(__is_same(Base, decltype(__builtin_base_type(T, 0)))); + static_assert(__is_same(int, decltype(__builtin_field_type(T, 0)))); + static_assert(__builtin_num_fields(T) == 1); + static_assert(__builtin_num_bases(T) == 1); +}; + +#--- test.cpp +// expected-no-diagnostics +struct A : public Base { int i; }; +void foo() { + X x; +} + From cca90aa3a0a9287b858dd11302e473b75db82685 Mon Sep 17 00:00:00 2001 From: "Podchishchaeva, Mariya" Date: Wed, 5 Nov 2025 09:48:29 -0800 Subject: [PATCH 2/2] Update test --- sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp b/sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp index ca70efa9b2db4..a9e7047d78dc0 100644 --- a/sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp +++ b/sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp @@ -102,4 +102,5 @@ int main(int argc, char **argv) { run({"sycl/multi_ptr.hpp"}); run({"sycl/builtins.hpp"}); run({"sycl/ext/oneapi/matrix/matrix.hpp"}); + run({"sycl/sycl.hpp"}); }