forked from OSchip/llvm-project
[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:
parent
2775b5caae
commit
7eb6938c48
|
@ -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 ||
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue