From: Anastasia Stulova Date: Mon, 15 Jul 2019 13:02:21 +0000 (+0000) Subject: [OpenCL] Deduce addr space for pointee of dependent types in instantiation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8f781eb49f98840e55d64ae674827e1e507d09c5;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366063 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index a6122c9338..3b841ec649 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -4536,6 +4536,14 @@ QualType TreeTransform::TransformDecayedType(TypeLocBuilder &TLB, 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 QualType TreeTransform::TransformPointerType(TypeLocBuilder &TLB, PointerTypeLoc TL) { @@ -4544,6 +4552,9 @@ QualType TreeTransform::TransformPointerType(TypeLocBuilder &TLB, if (PointeeType.isNull()) return QualType(); + if (SemaRef.getLangOpts().OpenCL) + deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType); + QualType Result = TL.getType(); if (PointeeType->getAs()) { // A dependent pointer type 'T *' has is being transformed such @@ -4582,6 +4593,9 @@ TreeTransform::TransformBlockPointerType(TypeLocBuilder &TLB, 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::TransformReferenceType(TypeLocBuilder &TLB, if (PointeeType.isNull()) return QualType(); + if (SemaRef.getLangOpts().OpenCL) + deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType); + QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || PointeeType != T->getPointeeTypeAsWritten()) { diff --git a/test/SemaOpenCLCXX/address-space-deduction.cl b/test/SemaOpenCLCXX/address-space-deduction.cl index 6b2a07cad7..f66d224e25 100644 --- a/test/SemaOpenCLCXX/address-space-deduction.cl +++ b/test/SemaOpenCLCXX/address-space-deduction.cl @@ -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 +struct x1 { +//CHECK: -CXXMethodDecl {{.*}} operator= 'x1 &(const x1 &) __generic' +//CHECK: -CXXMethodDecl {{.*}} operator= '__generic x1 &(const __generic x1 &) __generic' + x1& operator=(const x1& xx) { + y = xx.y; + return *this; + } + int y; +}; + +template +struct x2 { +//CHECK: -CXXMethodDecl {{.*}} foo 'void (x1 *) __generic' +//CHECK: -CXXMethodDecl {{.*}} foo 'void (__generic x1 *) __generic' + void foo(x1* xx) { + m[0] = *xx; + } +//CHECK: -FieldDecl {{.*}} m 'x1 [2]' + x1 m[2]; +}; + +void bar(__global x1 *xx, __global x2 *bar) { + bar->foo(xx); +} + +template +class x3 : public T { +public: + //CHECK: -CXXConstructorDecl {{.*}} x3 'void (const x3 &) __generic' + x3(const x3 &t); +}; +//CHECK: -CXXConstructorDecl {{.*}} x3 'void (const x3 &) __generic' +template +x3::x3(const x3 &t) {}