Fix ICE on reference binding with mismatching addr spaces.

When we attempt to add an addr space qual to a type already
qualified by an addr space ICE is triggered. Before creating
a type with new address space, remove the old addr space.

Fixing PR38614!

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

llvm-svn: 353160
This commit is contained in:
Anastasia Stulova 2019-02-05 11:32:58 +00:00
parent 84ca706be1
commit e368e4dfd0
2 changed files with 28 additions and 10 deletions

View File

@ -4670,19 +4670,23 @@ static void TryReferenceInitializationCore(Sema &S,
// applied.
// Postpone address space conversions to after the temporary materialization
// conversion to allow creating temporaries in the alloca address space.
auto AS1 = T1Quals.getAddressSpace();
auto AS2 = T2Quals.getAddressSpace();
T1Quals.removeAddressSpace();
T2Quals.removeAddressSpace();
QualType cv1T4 = S.Context.getQualifiedType(cv2T2, T1Quals);
if (T1Quals != T2Quals)
auto T1QualsIgnoreAS = T1Quals;
auto T2QualsIgnoreAS = T2Quals;
if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
T1QualsIgnoreAS.removeAddressSpace();
T2QualsIgnoreAS.removeAddressSpace();
}
QualType cv1T4 = S.Context.getQualifiedType(cv2T2, T1QualsIgnoreAS);
if (T1QualsIgnoreAS != T2QualsIgnoreAS)
Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_RValue);
ValueKind = isLValueRef ? VK_LValue : VK_XValue;
if (AS1 != AS2) {
T1Quals.addAddressSpace(AS1);
QualType cv1AST4 = S.Context.getQualifiedType(cv2T2, T1Quals);
Sequence.AddQualificationConversionStep(cv1AST4, ValueKind);
// Add addr space conversion if required.
if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
auto T4Quals = cv1T4.getQualifiers();
T4Quals.addAddressSpace(T1Quals.getAddressSpace());
QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
}
// In any case, the reference is bound to the resulting glvalue (or to

View File

@ -0,0 +1,14 @@
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=c++ -pedantic -verify -fsyntax-only
// expected-no-diagnostics
// Extract from PR38614
struct C {};
C f1() {
return C{};
}
C f2(){
C c;
return c;
}