зеркало из https://github.com/microsoft/clang-1.git
The type of a compound literal expression is not necessarily the same as the
type which was syntactically written. Fixes PR 6080. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e8c7043f6c
Коммит
1d7d8d66ef
|
@ -1462,14 +1462,17 @@ class CompoundLiteralExpr : public Expr {
|
|||
/// compound literal like "(int){4}". This can be null if this is a
|
||||
/// synthesized compound expression.
|
||||
SourceLocation LParenLoc;
|
||||
|
||||
/// The type as written. This can be an incomplete array type, in
|
||||
/// which case the actual expression type will be different.
|
||||
TypeSourceInfo *TInfo;
|
||||
Stmt *Init;
|
||||
bool FileScope;
|
||||
public:
|
||||
// FIXME: Can compound literals be value-dependent?
|
||||
CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo,
|
||||
Expr *init, bool fileScope)
|
||||
: Expr(CompoundLiteralExprClass, tinfo->getType(),
|
||||
QualType T, Expr *init, bool fileScope)
|
||||
: Expr(CompoundLiteralExprClass, T,
|
||||
tinfo->getType()->isDependentType(), false),
|
||||
LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {}
|
||||
|
||||
|
|
|
@ -2516,8 +2516,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
|
|||
SourceLocation());
|
||||
TypeSourceInfo *superTInfo
|
||||
= Context->getTrivialTypeSourceInfo(superType);
|
||||
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(),
|
||||
superTInfo, ILE, false);
|
||||
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
|
||||
superType, ILE, false);
|
||||
// struct objc_super *
|
||||
SuperRep = new (Context) UnaryOperator(SuperRep, UnaryOperator::AddrOf,
|
||||
Context->getPointerType(SuperRep->getType()),
|
||||
|
@ -2601,8 +2601,8 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
|
|||
SourceLocation());
|
||||
TypeSourceInfo *superTInfo
|
||||
= Context->getTrivialTypeSourceInfo(superType);
|
||||
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(),
|
||||
superTInfo, ILE, false);
|
||||
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
|
||||
superType, ILE, false);
|
||||
}
|
||||
MsgExprs.push_back(SuperRep);
|
||||
} else {
|
||||
|
|
|
@ -3707,7 +3707,7 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
|
|||
|
||||
Result.release();
|
||||
|
||||
return Owned(new (Context) CompoundLiteralExpr(LParenLoc, TInfo,
|
||||
return Owned(new (Context) CompoundLiteralExpr(LParenLoc, TInfo, literalType,
|
||||
literalExpr, isFileScope));
|
||||
}
|
||||
|
||||
|
@ -4718,7 +4718,7 @@ static void ConstructTransparentUnion(ASTContext &C, Expr *&E,
|
|||
// Build a compound literal constructing a value of the transparent
|
||||
// union type from this initializer list.
|
||||
TypeSourceInfo *unionTInfo = C.getTrivialTypeSourceInfo(UnionType);
|
||||
E = new (C) CompoundLiteralExpr(SourceLocation(), unionTInfo,
|
||||
E = new (C) CompoundLiteralExpr(SourceLocation(), unionTInfo, UnionType,
|
||||
Initializer, false);
|
||||
}
|
||||
|
||||
|
|
|
@ -3867,6 +3867,10 @@ TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
|
|||
Init.get() == E->getInitializer())
|
||||
return SemaRef.Owned(E->Retain());
|
||||
|
||||
// Note: the expression type doesn't necessarily match the
|
||||
// type-as-written, but that's okay, because it should always be
|
||||
// derivable from the initializer.
|
||||
|
||||
return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
|
||||
/*FIXME:*/E->getInitializer()->getLocEnd(),
|
||||
move(Init));
|
||||
|
|
|
@ -31,3 +31,6 @@ void IncompleteFunc(unsigned x) {
|
|||
(void){1,2,3}; // -expected-error {{variable has incomplete type}}
|
||||
(void(void)) { 0 }; // -expected-error{{illegal initializer type 'void (void)'}}
|
||||
}
|
||||
|
||||
// PR6080
|
||||
int array[(sizeof(int[3]) == sizeof( (int[]) {0,1,2} )) ? 1 : -1];
|
||||
|
|
Загрузка…
Ссылка в новой задаче