olestrohm updated this revision to Diff 276369. olestrohm marked an inline comment as done. olestrohm added a comment.
I've removed the comments calling for a fix because I no longer feel that this approach needs that. Given the code that already exists, and without changing too much of it, adding address space deduction in both cases seems like the right choice. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82781/new/ https://reviews.llvm.org/D82781 Files: clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/test/SemaOpenCLCXX/address-space-deduction.cl
Index: clang/test/SemaOpenCLCXX/address-space-deduction.cl =================================================================== --- clang/test/SemaOpenCLCXX/address-space-deduction.cl +++ clang/test/SemaOpenCLCXX/address-space-deduction.cl @@ -5,6 +5,11 @@ //CHECK: |-VarDecl {{.*}} foo 'const __global int' constexpr int foo = 0; +//CHECK: |-VarDecl {{.*}} foo1 'T' cinit +//CHECK: `-VarTemplateSpecializationDecl {{.*}} used foo1 '__global long':'__global long' cinit +template <typename T> +T foo1 = 0; + class c { public: //CHECK: `-VarDecl {{.*}} foo2 'const __global int' @@ -30,7 +35,7 @@ template <class T> struct x1 { -//CHECK: -CXXMethodDecl {{.*}} operator= 'x1<T> &(const x1<T> &__private){{( __attribute__.*)?}} __generic' +//CHECK: -CXXMethodDecl {{.*}} operator= 'x1<T> &(const x1<T> &){{( __attribute__.*)?}} __generic' //CHECK: -CXXMethodDecl {{.*}} operator= '__generic x1<int> &(const __generic x1<int> &__private){{( __attribute__.*)?}} __generic' x1<T>& operator=(const x1<T>& xx) { y = xx.y; @@ -41,7 +46,7 @@ template <class T> struct x2 { -//CHECK: -CXXMethodDecl {{.*}} foo 'void (x1<T> *__private){{( __attribute__.*)?}} __generic' +//CHECK: -CXXMethodDecl {{.*}} foo 'void (x1<T> *){{( __attribute__.*)?}} __generic' //CHECK: -CXXMethodDecl {{.*}} foo 'void (__generic x1<int> *__private){{( __attribute__.*)?}} __generic' void foo(x1<T>* xx) { m[0] = *xx; @@ -57,10 +62,10 @@ template <typename T> class x3 : public T { public: - //CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &__private){{( __attribute__.*)?}} __generic' + //CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &){{( __attribute__.*)?}} __generic' x3(const x3 &t); }; -//CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &__private){{( __attribute__.*)?}} __generic' +//CHECK: -CXXConstructorDecl {{.*}} x3<T> 'void (const x3<T> &){{( __attribute__.*)?}} __generic' template <typename T> x3<T>::x3(const x3<T> &t) {} @@ -68,7 +73,8 @@ T xxx(T *in1, T in2) { // This pointer can't be deduced to generic because addr space // will be taken from the template argument. - //CHECK: `-VarDecl {{.*}} '__private T *__private' cinit + //CHECK: `-VarDecl {{.*}} 'T *' cinit + //CHECK: `-VarDecl {{.*}} i '__private int *__private' cinit T *i = in1; T ii; __private T *ptr = ⅈ @@ -111,4 +117,5 @@ t3(&x); t4(&p); t5(&p); + long f1 = foo1<long>; } Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3625,6 +3625,9 @@ if (InsertPos) VarTemplate->AddSpecialization(Var, InsertPos); + if (SemaRef.getLangOpts().OpenCL) + SemaRef.deduceOpenCLAddressSpace(Var); + // Substitute the nested name specifier, if any. if (SubstQualifier(D, Var)) return nullptr; @@ -4803,6 +4806,9 @@ // Instantiate the initializer. InstantiateVariableInitializer(VarSpec, PatternDecl, TemplateArgs); + if (getLangOpts().OpenCL) + deduceOpenCLAddressSpace(VarSpec); + return VarSpec; } Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -6287,6 +6287,8 @@ void Sema::deduceOpenCLAddressSpace(ValueDecl *Decl) { if (Decl->getType().hasAddressSpace()) return; + if (Decl->getType()->isDependentType()) + return; if (VarDecl *Var = dyn_cast<VarDecl>(Decl)) { QualType Type = Var->getType(); if (Type->isSamplerT() || Type->isVoidType()) @@ -7856,6 +7858,7 @@ if (NewVD->isFileVarDecl() || NewVD->isStaticLocal() || NewVD->hasExternalStorage()) { if (!T->isSamplerT() && + !T->isDependentType() && !(T.getAddressSpace() == LangAS::opencl_constant || (T.getAddressSpace() == LangAS::opencl_global && (getLangOpts().OpenCLVersion == 200 ||
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits