@@ -4432,7 +4432,8 @@ static void TryReferenceInitializationCore(Sema &S,
4432
4432
Qualifiers T1Quals,
4433
4433
QualType cv2T2, QualType T2,
4434
4434
Qualifiers T2Quals,
4435
- InitializationSequence &Sequence);
4435
+ InitializationSequence &Sequence,
4436
+ bool TopLevelOfInitList);
4436
4437
4437
4438
static void TryValueInitialization (Sema &S,
4438
4439
const InitializedEntity &Entity,
@@ -4486,7 +4487,8 @@ static void TryReferenceListInitialization(Sema &S,
4486
4487
if (RefRelationship >= Sema::Ref_Related) {
4487
4488
// Try to bind the reference here.
4488
4489
TryReferenceInitializationCore (S, Entity, Kind, Initializer, cv1T1, T1,
4489
- T1Quals, cv2T2, T2, T2Quals, Sequence);
4490
+ T1Quals, cv2T2, T2, T2Quals, Sequence,
4491
+ /* TopLevelOfInitList=*/ true );
4490
4492
if (Sequence)
4491
4493
Sequence.RewrapReferenceInitList (cv1T1, InitList);
4492
4494
return ;
@@ -4945,11 +4947,11 @@ static void CheckCXX98CompatAccessibleCopy(Sema &S,
4945
4947
Expr *CurInitExpr);
4946
4948
4947
4949
// / Attempt reference initialization (C++0x [dcl.init.ref])
4948
- static void TryReferenceInitialization (Sema &S,
4949
- const InitializedEntity &Entity,
4950
+ static void TryReferenceInitialization (Sema &S, const InitializedEntity &Entity,
4950
4951
const InitializationKind &Kind,
4951
4952
Expr *Initializer,
4952
- InitializationSequence &Sequence) {
4953
+ InitializationSequence &Sequence,
4954
+ bool TopLevelOfInitList) {
4953
4955
QualType DestType = Entity.getType ();
4954
4956
QualType cv1T1 = DestType->castAs <ReferenceType>()->getPointeeType ();
4955
4957
Qualifiers T1Quals;
@@ -4967,7 +4969,8 @@ static void TryReferenceInitialization(Sema &S,
4967
4969
4968
4970
// Delegate everything else to a subfunction.
4969
4971
TryReferenceInitializationCore (S, Entity, Kind, Initializer, cv1T1, T1,
4970
- T1Quals, cv2T2, T2, T2Quals, Sequence);
4972
+ T1Quals, cv2T2, T2, T2Quals, Sequence,
4973
+ TopLevelOfInitList);
4971
4974
}
4972
4975
4973
4976
// / Determine whether an expression is a non-referenceable glvalue (one to
@@ -4990,7 +4993,8 @@ static void TryReferenceInitializationCore(Sema &S,
4990
4993
Qualifiers T1Quals,
4991
4994
QualType cv2T2, QualType T2,
4992
4995
Qualifiers T2Quals,
4993
- InitializationSequence &Sequence) {
4996
+ InitializationSequence &Sequence,
4997
+ bool TopLevelOfInitList) {
4994
4998
QualType DestType = Entity.getType ();
4995
4999
SourceLocation DeclLoc = Initializer->getBeginLoc ();
4996
5000
@@ -5264,7 +5268,8 @@ static void TryReferenceInitializationCore(Sema &S,
5264
5268
Sequence.SetFailed (InitializationSequence::FK_ReferenceInitFailed);
5265
5269
return ;
5266
5270
} else {
5267
- Sequence.AddConversionSequenceStep (ICS, TempEntity.getType ());
5271
+ Sequence.AddConversionSequenceStep (ICS, TempEntity.getType (),
5272
+ TopLevelOfInitList);
5268
5273
}
5269
5274
5270
5275
// [...] If T1 is reference-related to T2, cv1 must be the
@@ -6228,7 +6233,8 @@ void InitializationSequence::InitializeFrom(Sema &S,
6228
6233
else if (isa<InitListExpr>(Args[0 ]))
6229
6234
SetFailed (FK_ParenthesizedListInitForReference);
6230
6235
else
6231
- TryReferenceInitialization (S, Entity, Kind, Args[0 ], *this );
6236
+ TryReferenceInitialization (S, Entity, Kind, Args[0 ], *this ,
6237
+ TopLevelOfInitList);
6232
6238
return ;
6233
6239
}
6234
6240
@@ -10431,7 +10437,7 @@ static void DiagnoseNarrowingInInitList(Sema &S,
10431
10437
: diag::warn_init_list_type_narrowing)
10432
10438
<< PostInit->getSourceRange ()
10433
10439
<< PreNarrowingType.getLocalUnqualifiedType ()
10434
- << EntityType.getLocalUnqualifiedType ();
10440
+ << EntityType.getNonReferenceType (). getLocalUnqualifiedType ();
10435
10441
break ;
10436
10442
10437
10443
case NK_Constant_Narrowing:
@@ -10442,7 +10448,7 @@ static void DiagnoseNarrowingInInitList(Sema &S,
10442
10448
: diag::warn_init_list_constant_narrowing)
10443
10449
<< PostInit->getSourceRange ()
10444
10450
<< ConstantValue.getAsString (S.getASTContext (), ConstantType)
10445
- << EntityType.getLocalUnqualifiedType ();
10451
+ << EntityType.getNonReferenceType (). getLocalUnqualifiedType ();
10446
10452
break ;
10447
10453
10448
10454
case NK_Variable_Narrowing:
@@ -10453,7 +10459,7 @@ static void DiagnoseNarrowingInInitList(Sema &S,
10453
10459
: diag::warn_init_list_variable_narrowing)
10454
10460
<< PostInit->getSourceRange ()
10455
10461
<< PreNarrowingType.getLocalUnqualifiedType ()
10456
- << EntityType.getLocalUnqualifiedType ();
10462
+ << EntityType.getNonReferenceType (). getLocalUnqualifiedType ();
10457
10463
break ;
10458
10464
}
10459
10465
0 commit comments