[OpenCL] Fix address space deduction in template args.

Don't deduce address spaces for non-pointer-like types
in template args.

Fixes PR38603!

Differential Revision: https://reviews.llvm.org/D54634

llvm-svn: 347189
This commit is contained in:
Anastasia Stulova 2018-11-19 11:00:14 +00:00
parent 2775b5caae
commit 7eb6938c48
2 changed files with 34 additions and 1 deletions

View File

@ -7227,7 +7227,9 @@ static void deduceOpenCLImplicitAddrSpace(TypeProcessingState &State,
if (IsPointee) {
ImpAddr = LangAS::opencl_generic;
} else {
if (D.getContext() == DeclaratorContext::FileContext) {
if (D.getContext() == DeclaratorContext::TemplateArgContext) {
// Do not deduce address space for non-pointee type in template args
} else if (D.getContext() == DeclaratorContext::FileContext) {
ImpAddr = LangAS::opencl_global;
} else {
if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||

View File

@ -0,0 +1,31 @@
// RUN: %clang_cc1 -cl-std=c++ %s -emit-llvm -o - -O0 -triple spir-unknown-unknown | FileCheck %s
template <typename T>
struct S{
T a;
T foo();
};
template<typename T>
T S<T>::foo() { return a;}
//CHECK: %struct.S = type { i32 }
//CHECK: %struct.S.0 = type { i32 addrspace(4)* }
//CHECK: %struct.S.1 = type { i32 addrspace(1)* }
//CHECK: i32 @_ZN1SIiE3fooEv(%struct.S* %this)
//CHECK: i32 addrspace(4)* @_ZN1SIPU3AS4iE3fooEv(%struct.S.0* %this)
//CHECK: i32 addrspace(1)* @_ZN1SIPU3AS1iE3fooEv(%struct.S.1* %this)
void bar(){
S<int> sint;
S<int*> sintptr;
S<__global int*> sintptrgl;
// FIXME: Preserve AS in TreeTransform
//S<__global int> sintgl;
sint.foo();
sintptr.foo();
sintptrgl.foo();
//sintgl.foo();
}