forked from OSchip/llvm-project
Try to handle qualifiers more consistently for array InitListExprs. Fixes <rdar://problem/10907510>, and makes the ASTs a bit more self-consistent.
(I've chosen to keep the qualifiers, but it isn't a strong preference; if anyone prefers removing them, please yell.) llvm-svn: 151229
This commit is contained in:
parent
d675a4cec0
commit
91f5ae5022
|
@ -905,10 +905,8 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
|||
}
|
||||
}
|
||||
|
||||
QualType elementType = E->getType().getCanonicalType();
|
||||
elementType = CGF.getContext().getQualifiedType(
|
||||
cast<ArrayType>(elementType)->getElementType(),
|
||||
elementType.getQualifiers() + Dest.getQualifiers());
|
||||
QualType elementType =
|
||||
CGF.getContext().getAsArrayType(E->getType())->getElementType();
|
||||
|
||||
llvm::PointerType *APType =
|
||||
cast<llvm::PointerType>(DestPtr->getType());
|
||||
|
|
|
@ -6226,10 +6226,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
|
|||
// completed by the initializer. For example:
|
||||
// int ary[] = { 1, 3, 5 };
|
||||
// "ary" transitions from an IncompleteArrayType to a ConstantArrayType.
|
||||
if (!VDecl->isInvalidDecl() && (DclT != SavT)) {
|
||||
if (!VDecl->isInvalidDecl() && (DclT != SavT))
|
||||
VDecl->setType(DclT);
|
||||
Init->setType(DclT.getNonReferenceType());
|
||||
}
|
||||
|
||||
// Check any implicit conversions within the expression.
|
||||
CheckImplicitConversions(Init, VDecl->getLocation());
|
||||
|
|
|
@ -604,7 +604,9 @@ void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
|
|||
CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
|
||||
Index, StructuredList, StructuredIndex, TopLevelObject);
|
||||
if (!VerifyOnly) {
|
||||
QualType ExprTy = T.getNonLValueExprType(SemaRef.Context);
|
||||
QualType ExprTy = T;
|
||||
if (!ExprTy->isArrayType())
|
||||
ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
|
||||
IList->setType(ExprTy);
|
||||
StructuredList->setType(ExprTy);
|
||||
}
|
||||
|
@ -2077,7 +2079,10 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
|
|||
InitRange.getBegin(), 0, 0,
|
||||
InitRange.getEnd());
|
||||
|
||||
Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context));
|
||||
QualType ResultType = CurrentObjectType;
|
||||
if (!ResultType->isArrayType())
|
||||
ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
|
||||
Result->setType(ResultType);
|
||||
|
||||
// Pre-allocate storage for the structured initializer list.
|
||||
unsigned NumElements = 0;
|
||||
|
|
|
@ -510,3 +510,7 @@ void test13(id x) {
|
|||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
// <rdar://problem/10907510>
|
||||
void test14() {
|
||||
void (^const x[1])(void) = { ^{} };
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue