This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG790cbaafc9e2: [OpenCL] Fix diagnostics with templates in kernel args. (authored by Anastasia). Herald added a subscriber: ldrumm. Herald added a project: clang.
Changed prior to commit: https://reviews.llvm.org/D134445?vs=470458&id=474577#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D134445/new/ https://reviews.llvm.org/D134445 Files: clang/lib/Sema/SemaDecl.cpp clang/test/SemaOpenCLCXX/invalid-kernel.clcpp Index: clang/test/SemaOpenCLCXX/invalid-kernel.clcpp =================================================================== --- clang/test/SemaOpenCLCXX/invalid-kernel.clcpp +++ clang/test/SemaOpenCLCXX/invalid-kernel.clcpp @@ -93,3 +93,24 @@ #ifndef UNSAFEKERNELPARAMETER //expected-error@-2{{'__global Trivial &__private' cannot be used as the type of a kernel parameter}} #endif + +// Nested types and templates +struct Outer { + struct Inner{ + int i; + }; +}; +template<class T> +struct OuterTempl { + struct Inner{ + int i; + }; +}; +// FIXME: (PR58590) Use of template parameter dependent types doesn't +// work yet due to lazy instantiation of reference types. +//template<class T> +//struct Templ { +//T i; +//}; + +extern kernel void nested(constant Outer::Inner& r1, constant OuterTempl<int>::Inner& r2/*, constant Templ<int>& r3*/); Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -9234,10 +9234,23 @@ // reference if an implementation supports them in kernel parameters. if (S.getLangOpts().OpenCLCPlusPlus && !S.getOpenCLOptions().isAvailableOption( - "__cl_clang_non_portable_kernel_param_types", S.getLangOpts()) && - !PointeeType->isAtomicType() && !PointeeType->isVoidType() && - !PointeeType->isStandardLayoutType()) + "__cl_clang_non_portable_kernel_param_types", S.getLangOpts())) { + auto CXXRec = PointeeType.getCanonicalType()->getAsCXXRecordDecl(); + bool IsStandardLayoutType = true; + if (CXXRec) { + // If template type is not ODR-used its definition is only available + // in the template definition not its instantiation. + // FIXME: This logic doesn't work for types that depend on template + // parameter (PR58590). + if (!CXXRec->hasDefinition()) + CXXRec = CXXRec->getTemplateInstantiationPattern(); + if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout()) + IsStandardLayoutType = false; + } + if (!PointeeType->isAtomicType() && !PointeeType->isVoidType() && + !IsStandardLayoutType) return InvalidKernelParam; + } return PtrKernelParam; }
Index: clang/test/SemaOpenCLCXX/invalid-kernel.clcpp =================================================================== --- clang/test/SemaOpenCLCXX/invalid-kernel.clcpp +++ clang/test/SemaOpenCLCXX/invalid-kernel.clcpp @@ -93,3 +93,24 @@ #ifndef UNSAFEKERNELPARAMETER //expected-error@-2{{'__global Trivial &__private' cannot be used as the type of a kernel parameter}} #endif + +// Nested types and templates +struct Outer { + struct Inner{ + int i; + }; +}; +template<class T> +struct OuterTempl { + struct Inner{ + int i; + }; +}; +// FIXME: (PR58590) Use of template parameter dependent types doesn't +// work yet due to lazy instantiation of reference types. +//template<class T> +//struct Templ { +//T i; +//}; + +extern kernel void nested(constant Outer::Inner& r1, constant OuterTempl<int>::Inner& r2/*, constant Templ<int>& r3*/); Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -9234,10 +9234,23 @@ // reference if an implementation supports them in kernel parameters. if (S.getLangOpts().OpenCLCPlusPlus && !S.getOpenCLOptions().isAvailableOption( - "__cl_clang_non_portable_kernel_param_types", S.getLangOpts()) && - !PointeeType->isAtomicType() && !PointeeType->isVoidType() && - !PointeeType->isStandardLayoutType()) + "__cl_clang_non_portable_kernel_param_types", S.getLangOpts())) { + auto CXXRec = PointeeType.getCanonicalType()->getAsCXXRecordDecl(); + bool IsStandardLayoutType = true; + if (CXXRec) { + // If template type is not ODR-used its definition is only available + // in the template definition not its instantiation. + // FIXME: This logic doesn't work for types that depend on template + // parameter (PR58590). + if (!CXXRec->hasDefinition()) + CXXRec = CXXRec->getTemplateInstantiationPattern(); + if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout()) + IsStandardLayoutType = false; + } + if (!PointeeType->isAtomicType() && !PointeeType->isVoidType() && + !IsStandardLayoutType) return InvalidKernelParam; + } return PtrKernelParam; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits