[OpenCL] Fix overloading ranking rules for addrspace conversions.

Extend ranking to work with address spaces correctly when
resolving overloads.

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

llvm-svn: 351546
This commit is contained in:
Anastasia Stulova 2019-01-18 11:38:16 +00:00
parent c196488531
commit ef19af1942
2 changed files with 27 additions and 1 deletions

View File

@ -4019,9 +4019,12 @@ CompareQualificationConversions(Sema &S,
// to unwrap. This essentially mimics what
// IsQualificationConversion does, but here we're checking for a
// strict subset of qualifiers.
if (T1.getCVRQualifiers() == T2.getCVRQualifiers())
if (T1.getQualifiers().withoutObjCLifetime() ==
T2.getQualifiers().withoutObjCLifetime())
// The qualifiers are the same, so this doesn't tell us anything
// about how the sequences rank.
// ObjC ownership quals are omitted above as they interfere with
// the ARC overload rule.
;
else if (T2.isMoreQualifiedThan(T1)) {
// T1 has fewer qualifiers, so it could be the better sequence.

View File

@ -0,0 +1,23 @@
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=c++
// expected-no-diagnostics
struct RetGlob {
int dummy;
};
struct RetGen {
char dummy;
};
RetGlob foo(const __global int *);
RetGen foo(const __generic int *);
void kernel k() {
__global int *ArgGlob;
__generic int *ArgGen;
__local int *ArgLoc;
RetGlob TestGlob = foo(ArgGlob);
RetGen TestGen = foo(ArgGen);
TestGen = foo(ArgLoc);
}