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; +} + 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"}); }