Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -4289,19 +4289,27 @@ if (Sequence.step_begin() != Sequence.step_end()) Sequence.RewrapReferenceInitList(cv1T1, InitList); } - + // Ignore address space of reference type at this point and perform address + // space conversion after the reference binding step. + QualType cv1T1IgnoreAS = + T1Quals.hasAddressSpace() + ? S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace()) + : cv1T1; // Not reference-related. Create a temporary and bind to that. - InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); + InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1IgnoreAS); TryListInitialization(S, TempEntity, Kind, InitList, Sequence, TreatUnavailableAsInvalid); if (Sequence) { if (DestType->isRValueReferenceType() || - (T1Quals.hasConst() && !T1Quals.hasVolatile())) - Sequence.AddReferenceBindingStep(cv1T1, /*BindingTemporary=*/true); + (T1Quals.hasConst() && !T1Quals.hasVolatile()))//TODO: I am guessing we need the same check address space check here too? + Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true); else Sequence.SetFailed( InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); + if (T1Quals.hasAddressSpace()) + Sequence.AddQualificationConversionStep(cv1T1, !DestType->isRValueReferenceType() ? VK_LValue + : VK_XValue); } } @@ -5018,9 +5026,9 @@ // than, cv2; otherwise, the program is ill-formed. unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); - if ((RefRelationship == Sema::Ref_Related && - (T1CVRQuals | T2CVRQuals) != T1CVRQuals) || - !T1Quals.isAddressSpaceSupersetOf(T2Quals)) { + if (RefRelationship == Sema::Ref_Related && + ((T1CVRQuals | T2CVRQuals) != T1CVRQuals || + !T1Quals.isAddressSpaceSupersetOf(T2Quals))) { Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); return; }