Author: stulova Date: Mon Jul 15 06:02:21 2019 New Revision: 366063 URL: http://llvm.org/viewvc/llvm-project?rev=366063&view=rev Log: [OpenCL] Deduce addr space for pointee of dependent types in instantiation.
Since pointee doesn't require context sensitive addr space deduction it's easier to handle pointee of dependent types during templ instantiation. Differential Revision: https://reviews.llvm.org/D64400 Modified: cfe/trunk/lib/Sema/TreeTransform.h cfe/trunk/test/SemaOpenCLCXX/address-space-deduction.cl Modified: cfe/trunk/lib/Sema/TreeTransform.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=366063&r1=366062&r2=366063&view=diff ============================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h (original) +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Jul 15 06:02:21 2019 @@ -4536,6 +4536,14 @@ QualType TreeTransform<Derived>::Transfo return Result; } +/// Helper to deduce addr space of a pointee type in OpenCL mode. +/// If the type is updated it will be overwritten in PointeeType param. +static void deduceOpenCLPointeeAddrSpace(Sema &SemaRef, QualType &PointeeType) { + if (PointeeType.getAddressSpace() == LangAS::Default) + PointeeType = SemaRef.Context.getAddrSpaceQualType(PointeeType, + LangAS::opencl_generic); +} + template<typename Derived> QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, PointerTypeLoc TL) { @@ -4544,6 +4552,9 @@ QualType TreeTransform<Derived>::Transfo if (PointeeType.isNull()) return QualType(); + if (SemaRef.getLangOpts().OpenCL) + deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType); + QualType Result = TL.getType(); if (PointeeType->getAs<ObjCObjectType>()) { // A dependent pointer type 'T *' has is being transformed such @@ -4582,6 +4593,9 @@ TreeTransform<Derived>::TransformBlockPo if (PointeeType.isNull()) return QualType(); + if (SemaRef.getLangOpts().OpenCL) + deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType); + QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || PointeeType != TL.getPointeeLoc().getType()) { @@ -4611,6 +4625,9 @@ TreeTransform<Derived>::TransformReferen if (PointeeType.isNull()) return QualType(); + if (SemaRef.getLangOpts().OpenCL) + deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType); + QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || PointeeType != T->getPointeeTypeAsWritten()) { Modified: cfe/trunk/test/SemaOpenCLCXX/address-space-deduction.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCLCXX/address-space-deduction.cl?rev=366063&r1=366062&r2=366063&view=diff ============================================================================== --- cfe/trunk/test/SemaOpenCLCXX/address-space-deduction.cl (original) +++ cfe/trunk/test/SemaOpenCLCXX/address-space-deduction.cl Mon Jul 15 06:02:21 2019 @@ -24,3 +24,42 @@ struct c2 { alias_c1_ptr ptr = &y; }; + +// Addr spaces for pointee of dependent types are not deduced +// during parsing but during template instantiation instead. + +template <class T> +struct x1 { +//CHECK: -CXXMethodDecl {{.*}} operator= 'x1<T> &(const x1<T> &) __generic' +//CHECK: -CXXMethodDecl {{.*}} operator= '__generic x1<int> &(const __generic x1<int> &) __generic' + x1<T>& operator=(const x1<T>& xx) { + y = xx.y; + return *this; + } + int y; +}; + +template <class T> +struct x2 { +//CHECK: -CXXMethodDecl {{.*}} foo 'void (x1<T> *) __generic' +//CHECK: -CXXMethodDecl {{.*}} foo 'void (__generic x1<int> *) __generic' + void foo(x1<T>* xx) { + m[0] = *xx; + } +//CHECK: -FieldDecl {{.*}} m 'x1<int> [2]' + x1<T> m[2]; +}; + +void bar(__global x1<int> *xx, __global x2<int> *bar) { + bar->foo(xx); +} + +template <typename T> +class x3 : public T { +public: + //CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &) __generic' + x3(const x3 &t); +}; +//CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &) __generic' +template <typename T> +x3<T>::x3(const x3<T> &t) {} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits