Revert r78535, it is causing a number of failures to build projects.

--- Reverse-merging r78535 into '.':
D    test/Sema/altivec-init.c
U    include/clang/Basic/DiagnosticSemaKinds.td
U    include/clang/AST/Expr.h
U    include/clang/AST/StmtNodes.def
U    include/clang/Parse/Parser.h
U    include/clang/Parse/Action.h
U    tools/clang-cc/clang-cc.cpp
U    lib/Frontend/PrintParserCallbacks.cpp
U    lib/CodeGen/CGExprScalar.cpp
U    lib/Sema/SemaInit.cpp
U    lib/Sema/Sema.h
U    lib/Sema/SemaExpr.cpp
U    lib/Sema/SemaTemplateInstantiateExpr.cpp
U    lib/AST/StmtProfile.cpp
U    lib/AST/Expr.cpp
U    lib/AST/StmtPrinter.cpp
U    lib/Parse/ParseExpr.cpp
U    lib/Parse/ParseExprCXX.cpp

llvm-svn: 78551
This commit is contained in:
Daniel Dunbar 2009-08-10 03:01:36 +00:00
parent 51cbd2d6c4
commit 481fe50903
18 changed files with 31 additions and 307 deletions

View File

@ -2382,53 +2382,6 @@ public:
virtual child_iterator child_end(); virtual child_iterator child_end();
}; };
class ParenListExpr : public Expr {
Stmt **Exprs;
unsigned NumExprs;
SourceLocation LParenLoc, RParenLoc;
protected:
virtual void DoDestroy(ASTContext& C);
public:
ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs,
unsigned numexprs, SourceLocation rparenloc);
~ParenListExpr() {}
/// \brief Build an empty paren list.
//explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
unsigned getNumExprs() const { return NumExprs; }
const Expr* getExpr(unsigned Init) const {
assert(Init < getNumExprs() && "Initializer access out of range!");
return cast_or_null<Expr>(Exprs[Init]);
}
Expr* getExpr(unsigned Init) {
assert(Init < getNumExprs() && "Initializer access out of range!");
return cast_or_null<Expr>(Exprs[Init]);
}
SourceLocation getLParenLoc() const { return LParenLoc; }
SourceLocation getRParenLoc() const { return RParenLoc; }
virtual SourceRange getSourceRange() const {
return SourceRange(LParenLoc, RParenLoc);
}
static bool classof(const Stmt *T) {
return T->getStmtClass() == ParenListExprClass;
}
static bool classof(const ParenListExpr *) { return true; }
// Iterators
virtual child_iterator child_begin();
virtual child_iterator child_end();
};
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Clang Extensions // Clang Extensions
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -91,7 +91,6 @@ EXPR(ExtVectorElementExpr , Expr)
EXPR(InitListExpr , Expr) EXPR(InitListExpr , Expr)
EXPR(DesignatedInitExpr , Expr) EXPR(DesignatedInitExpr , Expr)
EXPR(ImplicitValueInitExpr , Expr) EXPR(ImplicitValueInitExpr , Expr)
EXPR(ParenListExpr , Expr)
EXPR(VAArgExpr , Expr) EXPR(VAArgExpr , Expr)
// GNU Extensions. // GNU Extensions.

View File

@ -2017,9 +2017,6 @@ def err_shufflevector_argument_too_large : Error<
"index for __builtin_shufflevector must be less than the total number " "index for __builtin_shufflevector must be less than the total number "
"of vector elements">; "of vector elements">;
def err_vector_incorrect_num_initializers : Error<
"%select{too many|too few}0 elements in vector initialization (expected %1 elements, have %2)">;
def err_altivec_empty_initializer : Error<"expected initializer">;
def err_stack_const_level : Error< def err_stack_const_level : Error<
"level argument for a stack address builtin must be constant">; "level argument for a stack address builtin must be constant">;

View File

@ -825,12 +825,6 @@ public:
return move(Val); // Default impl returns operand. return move(Val); // Default impl returns operand.
} }
virtual OwningExprResult ActOnParenListExpr(SourceLocation L,
SourceLocation R,
MultiExprArg Val) {
return ExprEmpty();
}
// Postfix Expressions. // Postfix Expressions.
virtual OwningExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, virtual OwningExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
tok::TokenKind Kind, tok::TokenKind Kind,
@ -907,12 +901,11 @@ public:
return ExprEmpty(); return ExprEmpty();
} }
virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
TypeTy *Ty, SourceLocation RParenLoc, SourceLocation RParenLoc, ExprArg Op) {
ExprArg Op) {
return ExprEmpty(); return ExprEmpty();
} }
virtual OwningExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, virtual OwningExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc,
tok::TokenKind Kind, tok::TokenKind Kind,
ExprArg LHS, ExprArg RHS) { ExprArg LHS, ExprArg RHS) {

View File

@ -705,11 +705,9 @@ private:
unsigned MinPrec); unsigned MinPrec);
OwningExprResult ParseCastExpression(bool isUnaryExpression, OwningExprResult ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand, bool isAddressOfOperand,
bool &NotCastExpr, bool &NotCastExpr);
bool parseParenAsExprList);
OwningExprResult ParseCastExpression(bool isUnaryExpression, OwningExprResult ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand = false, bool isAddressOfOperand = false);
bool parseParenAsExprList = false);
OwningExprResult ParsePostfixExpressionSuffix(OwningExprResult LHS); OwningExprResult ParsePostfixExpressionSuffix(OwningExprResult LHS);
OwningExprResult ParseSizeofAlignofExpression(); OwningExprResult ParseSizeofAlignofExpression();
OwningExprResult ParseBuiltinPrimaryExpression(); OwningExprResult ParseBuiltinPrimaryExpression();
@ -735,7 +733,6 @@ private:
}; };
OwningExprResult ParseParenExpression(ParenParseOption &ExprType, OwningExprResult ParseParenExpression(ParenParseOption &ExprType,
bool stopIfCastExpr, bool stopIfCastExpr,
bool parseAsExprList,
TypeTy *&CastTy, TypeTy *&CastTy,
SourceLocation &RParenLoc); SourceLocation &RParenLoc);

View File

@ -1784,26 +1784,6 @@ void DesignatedInitExpr::DoDestroy(ASTContext &C) {
Expr::DoDestroy(C); Expr::DoDestroy(C);
} }
ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
Expr **exprs, unsigned nexprs,
SourceLocation rparenloc)
: Expr(ParenListExprClass, QualType(),
hasAnyTypeDependentArguments(exprs, nexprs),
hasAnyValueDependentArguments(exprs, nexprs)),
NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
Exprs = new (C) Stmt*[nexprs];
for (unsigned i = 0; i != nexprs; ++i)
Exprs[i] = exprs[i];
}
void ParenListExpr::DoDestroy(ASTContext& C) {
DestroyChildren(C);
if (Exprs) C.Deallocate(Exprs);
this->~ParenListExpr();
C.Deallocate(this);
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// ExprIterator. // ExprIterator.
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -2008,14 +1988,6 @@ Stmt::child_iterator ImplicitValueInitExpr::child_end() {
return child_iterator(); return child_iterator();
} }
// ParenListExpr
Stmt::child_iterator ParenListExpr::child_begin() {
return &Exprs[0];
}
Stmt::child_iterator ParenListExpr::child_end() {
return &Exprs[0]+NumExprs;
}
// ObjCStringLiteral // ObjCStringLiteral
Stmt::child_iterator ObjCStringLiteral::child_begin() { Stmt::child_iterator ObjCStringLiteral::child_begin() {
return &String; return &String;

View File

@ -850,15 +850,6 @@ void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
OS << " }"; OS << " }";
} }
void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
OS << "( ";
for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
if (i) OS << ", ";
PrintExpr(Node->getExpr(i));
}
OS << " )";
}
void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(),
DEnd = Node->designators_end(); DEnd = Node->designators_end();

View File

@ -245,10 +245,6 @@ void StmtProfiler::VisitParenExpr(ParenExpr *S) {
VisitExpr(S); VisitExpr(S);
} }
void StmtProfiler::VisitParenListExpr(ParenListExpr *S) {
VisitExpr(S);
}
void StmtProfiler::VisitUnaryOperator(UnaryOperator *S) { void StmtProfiler::VisitUnaryOperator(UnaryOperator *S) {
VisitExpr(S); VisitExpr(S);
ID.AddInteger(S->getOpcode()); ID.AddInteger(S->getOpcode());

View File

@ -475,7 +475,7 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
} }
// A scalar can be splatted to an extended vector of the same element type // A scalar can be splatted to an extended vector of the same element type
if (DstType->isExtVectorType() && !SrcType->isVectorType()) { if (DstType->isExtVectorType() && !isa<VectorType>(SrcType)) {
// Cast the scalar to element type // Cast the scalar to element type
QualType EltTy = DstType->getAsExtVectorType()->getElementType(); QualType EltTy = DstType->getAsExtVectorType()->getElementType();
llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy); llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy);

View File

@ -574,9 +574,8 @@ namespace {
Out << __FUNCTION__ << "\n"; Out << __FUNCTION__ << "\n";
return ExprEmpty(); return ExprEmpty();
} }
virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
TypeTy *Ty, SourceLocation RParenLoc, SourceLocation RParenLoc,ExprArg Op){
ExprArg Op) {
Out << __FUNCTION__ << "\n"; Out << __FUNCTION__ << "\n";
return ExprEmpty(); return ExprEmpty();
} }

View File

@ -407,13 +407,11 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) {
/// due to member pointers. /// due to member pointers.
/// ///
Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand, bool isAddressOfOperand) {
bool parseParenAsExprList){
bool NotCastExpr; bool NotCastExpr;
OwningExprResult Res = ParseCastExpression(isUnaryExpression, OwningExprResult Res = ParseCastExpression(isUnaryExpression,
isAddressOfOperand, isAddressOfOperand,
NotCastExpr, NotCastExpr);
parseParenAsExprList);
if (NotCastExpr) if (NotCastExpr)
Diag(Tok, diag::err_expected_expression); Diag(Tok, diag::err_expected_expression);
return move(Res); return move(Res);
@ -532,8 +530,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
/// ///
Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand, bool isAddressOfOperand,
bool &NotCastExpr, bool &NotCastExpr) {
bool parseParenAsExprList){
OwningExprResult Res(Actions); OwningExprResult Res(Actions);
tok::TokenKind SavedKind = Tok.getKind(); tok::TokenKind SavedKind = Tok.getKind();
NotCastExpr = false; NotCastExpr = false;
@ -558,7 +555,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
SourceLocation LParenLoc = Tok.getLocation(); SourceLocation LParenLoc = Tok.getLocation();
SourceLocation RParenLoc; SourceLocation RParenLoc;
Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/, Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
parseParenAsExprList, CastTy, RParenLoc); CastTy, RParenLoc);
if (Res.isInvalid()) return move(Res); if (Res.isInvalid()) return move(Res);
switch (ParenExprType) { switch (ParenExprType) {
@ -1024,7 +1021,7 @@ Parser::ParseExprAfterTypeofSizeofAlignof(const Token &OpTok,
// operands. // operands.
EnterExpressionEvaluationContext Unevaluated(Actions, EnterExpressionEvaluationContext Unevaluated(Actions,
Action::Unevaluated); Action::Unevaluated);
Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, false, Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/,
CastTy, RParenLoc); CastTy, RParenLoc);
CastRange = SourceRange(LParenLoc, RParenLoc); CastRange = SourceRange(LParenLoc, RParenLoc);
@ -1281,8 +1278,7 @@ Parser::OwningExprResult Parser::ParseBuiltinPrimaryExpression() {
/// ///
Parser::OwningExprResult Parser::OwningExprResult
Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
bool parseAsExprList, TypeTy *&CastTy, TypeTy *&CastTy, SourceLocation &RParenLoc) {
SourceLocation &RParenLoc) {
assert(Tok.is(tok::l_paren) && "Not a paren expr!"); assert(Tok.is(tok::l_paren) && "Not a paren expr!");
GreaterThanIsOperatorScope G(GreaterThanIsOperator, true); GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
SourceLocation OpenLoc = ConsumeParen(); SourceLocation OpenLoc = ConsumeParen();
@ -1342,25 +1338,14 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
// Parse the cast-expression that follows it next. // Parse the cast-expression that follows it next.
// TODO: For cast expression with CastTy. // TODO: For cast expression with CastTy.
Result = ParseCastExpression(false, false, true); Result = ParseCastExpression(false);
if (!Result.isInvalid()) if (!Result.isInvalid())
Result = Actions.ActOnCastExpr(CurScope, OpenLoc, CastTy, RParenLoc, Result = Actions.ActOnCastExpr(OpenLoc, CastTy, RParenLoc,move(Result));
move(Result));
return move(Result); return move(Result);
} }
Diag(Tok, diag::err_expected_lbrace_in_compound_literal); Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
return ExprError(); return ExprError();
} else if (parseAsExprList) {
// Parse the expression-list.
ExprVector ArgExprs(Actions);
CommaLocsTy CommaLocs;
if (!ParseExpressionList(ArgExprs, CommaLocs)) {
ExprType = SimpleExpr;
Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
move_arg(ArgExprs));
}
} else { } else {
Result = ParseExpression(); Result = ParseExpression();
ExprType = SimpleExpr; ExprType = SimpleExpr;

View File

@ -1154,7 +1154,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
// will be consumed. // will be consumed.
Result = ParseCastExpression(false/*isUnaryExpression*/, Result = ParseCastExpression(false/*isUnaryExpression*/,
false/*isAddressofOperand*/, false/*isAddressofOperand*/,
NotCastExpr, false); NotCastExpr);
} }
// If we parsed a cast-expression, it's really a type-id, otherwise it's // If we parsed a cast-expression, it's really a type-id, otherwise it's
@ -1196,8 +1196,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
// Result is what ParseCastExpression returned earlier. // Result is what ParseCastExpression returned earlier.
if (!Result.isInvalid()) if (!Result.isInvalid())
Result = Actions.ActOnCastExpr(CurScope, LParenLoc, CastTy, RParenLoc, Result = Actions.ActOnCastExpr(LParenLoc, CastTy, RParenLoc,move(Result));
move(Result));
return move(Result); return move(Result);
} }

View File

@ -50,7 +50,6 @@ namespace clang {
class Stmt; class Stmt;
class Expr; class Expr;
class InitListExpr; class InitListExpr;
class ParenListExpr;
class DesignatedInitExpr; class DesignatedInitExpr;
class CallExpr; class CallExpr;
class DeclRefExpr; class DeclRefExpr;
@ -1485,10 +1484,7 @@ public:
virtual OwningExprResult ActOnCharacterConstant(const Token &); virtual OwningExprResult ActOnCharacterConstant(const Token &);
virtual OwningExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, virtual OwningExprResult ActOnParenExpr(SourceLocation L, SourceLocation R,
ExprArg Val); ExprArg Val);
virtual OwningExprResult ActOnParenListExpr(SourceLocation L,
SourceLocation R,
MultiExprArg Val);
/// ActOnStringLiteral - The specified tokens were lexed as pasted string /// ActOnStringLiteral - The specified tokens were lexed as pasted string
/// fragments (e.g. "foo" "bar" L"baz"). /// fragments (e.g. "foo" "bar" L"baz").
virtual OwningExprResult ActOnStringLiteral(const Token *Toks, virtual OwningExprResult ActOnStringLiteral(const Token *Toks,
@ -1549,14 +1545,8 @@ public:
SourceLocation *CommaLocs, SourceLocation *CommaLocs,
SourceLocation RParenLoc); SourceLocation RParenLoc);
virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
TypeTy *Ty, SourceLocation RParenLoc, SourceLocation RParenLoc, ExprArg Op);
ExprArg Op);
OwningExprResult ConvertParenListExpr(Scope *S, ParenListExpr *E);
OwningExprResult ActOnCastOfParenListExpr(Scope *S, SourceLocation LParenLoc,
SourceLocation RParenLoc,
ParenListExpr *E, QualType Ty);
virtual OwningExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, virtual OwningExprResult ActOnCompoundLiteral(SourceLocation LParenLoc,
TypeTy *Ty, TypeTy *Ty,

View File

@ -1918,8 +1918,7 @@ Sema::ActOnArraySubscriptExpr(Scope *S, ExprArg Base, SourceLocation LLoc,
<< LHSExp->getSourceRange() << RHSExp->getSourceRange()); << LHSExp->getSourceRange() << RHSExp->getSourceRange());
} }
// C99 6.5.2.1p1 // C99 6.5.2.1p1
if (!(IndexExpr->getType()->isIntegerType() && if (!IndexExpr->getType()->isIntegerType() && !IndexExpr->isTypeDependent())
IndexExpr->getType()->isScalarType()) && !IndexExpr->isTypeDependent())
return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer) return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer)
<< IndexExpr->getSourceRange()); << IndexExpr->getSourceRange());
@ -2115,11 +2114,6 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
Expr *BaseExpr = Base.takeAs<Expr>(); Expr *BaseExpr = Base.takeAs<Expr>();
assert(BaseExpr && "no record expression"); assert(BaseExpr && "no record expression");
// If BaseExpr is a ParenListExpr then convert it into a standard
// paren expr since this is not an altivec initializer.
if (ParenListExpr *PE = dyn_cast<ParenListExpr>(BaseExpr))
BaseExpr = ConvertParenListExpr(S, PE).takeAs<Expr>();
// Perform default conversions. // Perform default conversions.
DefaultFunctionArrayConversion(BaseExpr); DefaultFunctionArrayConversion(BaseExpr);
@ -2695,11 +2689,6 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
FunctionDecl *FDecl = NULL; FunctionDecl *FDecl = NULL;
NamedDecl *NDecl = NULL; NamedDecl *NDecl = NULL;
DeclarationName UnqualifiedName; DeclarationName UnqualifiedName;
// If the function is a ParenListExpr, then convert it into a standard
// paren expr since this is not an altivec initializer.
if (ParenListExpr *PE = dyn_cast<ParenListExpr>(Fn))
Fn = ConvertParenListExpr(S, PE).takeAs<Expr>();
if (getLangOptions().CPlusPlus) { if (getLangOptions().CPlusPlus) {
// Determine whether this is a dependent call inside a C++ template, // Determine whether this is a dependent call inside a C++ template,
@ -3101,7 +3090,7 @@ bool Sema::CheckExtVectorCast(SourceRange R, QualType DestTy, QualType SrcTy) {
} }
Action::OwningExprResult Action::OwningExprResult
Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty, Sema::ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
SourceLocation RParenLoc, ExprArg Op) { SourceLocation RParenLoc, ExprArg Op) {
CastExpr::CastKind Kind = CastExpr::CK_Unknown; CastExpr::CastKind Kind = CastExpr::CK_Unknown;
@ -3110,10 +3099,6 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty,
Expr *castExpr = Op.takeAs<Expr>(); Expr *castExpr = Op.takeAs<Expr>();
QualType castType = QualType::getFromOpaquePtr(Ty); QualType castType = QualType::getFromOpaquePtr(Ty);
// If the Expr being casted is a ParenListExpr, handle it specially.
if (ParenListExpr *PE = dyn_cast<ParenListExpr>(castExpr))
return ActOnCastOfParenListExpr(S, LParenLoc, RParenLoc, PE, castType);
if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), castType, castExpr, if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), castType, castExpr,
Kind)) Kind))
@ -3123,68 +3108,6 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty,
LParenLoc, RParenLoc)); LParenLoc, RParenLoc));
} }
/// This is not an AltiVec-style cast, so turn the ParenListExpr into a sequence
/// of comma binary operators.
Action::OwningExprResult
Sema::ConvertParenListExpr(Scope *S, ParenListExpr *E) {
OwningExprResult Result(*this, E->getExpr(0));
for (unsigned i = 1, e = E->getNumExprs(); i != e && !Result.isInvalid(); ++i)
Result = ActOnBinOp(S, E->getExprLoc(), tok::comma, move(Result),
Owned(E->getExpr(i)));
return move(Result);
}
Action::OwningExprResult
Sema::ActOnCastOfParenListExpr(Scope *S, SourceLocation LParenLoc,
SourceLocation RParenLoc,
ParenListExpr *E, QualType Ty) {
// If this is an altivec initializer, '(' type ')' '(' init, ..., init ')'
// then handle it as such.
if (getLangOptions().AltiVec && Ty->isVectorType()) {
if (E->getNumExprs() == 0) {
Diag(E->getExprLoc(), diag::err_altivec_empty_initializer);
return ExprError();
}
llvm::SmallVector<Expr *, 8> initExprs;
for (unsigned i = 0, e = E->getNumExprs(); i != e; ++i)
initExprs.push_back(E->getExpr(i));
// FIXME: This means that pretty-printing the final AST will produce curly
// braces instead of the original commas.
InitListExpr *E = new (Context) InitListExpr(LParenLoc, &initExprs[0],
initExprs.size(), RParenLoc);
E->setType(Ty);
return ActOnCompoundLiteral(LParenLoc, Ty.getAsOpaquePtr(), RParenLoc,
Owned(E));
} else {
// This is not an AltiVec-style cast, so turn the ParenListExpr into a
// sequence of BinOp comma operators.
OwningExprResult Result = ConvertParenListExpr(S, E);
Expr *castExpr = (Expr *)Result.get();
CastExpr::CastKind Kind = CastExpr::CK_Unknown;
if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), Ty, castExpr, Kind))
return ExprError();
return Owned(new (Context) CStyleCastExpr(Ty.getNonReferenceType(),
CastExpr::CK_Unknown,
Result.takeAs<Expr>(), Ty,
LParenLoc, RParenLoc));
}
}
Action::OwningExprResult Sema::ActOnParenListExpr(SourceLocation L,
SourceLocation R,
MultiExprArg Val) {
unsigned nexprs = Val.size();
Expr **exprs = reinterpret_cast<Expr**>(Val.release());
assert((exprs != 0) && "ActOnParenListExpr() missing expr list");
Expr *expr = new (Context) ParenListExpr(Context, L, exprs, nexprs, R);
return Owned(expr);
}
/// Note that lhs is not null here, even if this is the gnu "x ?: y" extension. /// Note that lhs is not null here, even if this is the gnu "x ?: y" extension.
/// In that case, lhs = cond. /// In that case, lhs = cond.
/// C99 6.5.15 /// C99 6.5.15
@ -3209,8 +3132,6 @@ QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS,
} }
// Now check the two expressions. // Now check the two expressions.
if (LHSTy->isVectorType() || RHSTy->isVectorType())
return CheckVectorOperands(QuestionLoc, LHS, RHS);
// If both operands have arithmetic type, do the usual arithmetic conversions // If both operands have arithmetic type, do the usual arithmetic conversions
// to find a common type: C99 6.5.15p3,5. // to find a common type: C99 6.5.15p3,5.

View File

@ -805,47 +805,16 @@ void InitListChecker::CheckVectorType(InitListExpr *IList, QualType DeclType,
unsigned &StructuredIndex) { unsigned &StructuredIndex) {
if (Index < IList->getNumInits()) { if (Index < IList->getNumInits()) {
const VectorType *VT = DeclType->getAsVectorType(); const VectorType *VT = DeclType->getAsVectorType();
unsigned maxElements = VT->getNumElements(); int maxElements = VT->getNumElements();
unsigned numEltsInit = 0;
QualType elementType = VT->getElementType(); QualType elementType = VT->getElementType();
if (!SemaRef.getLangOptions().OpenCL) { for (int i = 0; i < maxElements; ++i) {
for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { // Don't attempt to go past the end of the init list
// Don't attempt to go past the end of the init list if (Index >= IList->getNumInits())
if (Index >= IList->getNumInits()) break;
break; CheckSubElementType(IList, elementType, Index,
CheckSubElementType(IList, elementType, Index, StructuredList, StructuredIndex);
StructuredList, StructuredIndex);
}
} else {
// OpenCL initializers allows vectors to be constructed from vectors.
for (unsigned i = 0; i < maxElements; ++i) {
// Don't attempt to go past the end of the init list
if (Index >= IList->getNumInits())
break;
QualType IType = IList->getInit(Index)->getType();
if (!IType->isVectorType()) {
CheckSubElementType(IList, elementType, Index,
StructuredList, StructuredIndex);
++numEltsInit;
} else {
const VectorType *IVT = IType->getAsVectorType();
unsigned numIElts = IVT->getNumElements();
QualType VecType = SemaRef.Context.getExtVectorType(elementType,
numIElts);
CheckSubElementType(IList, VecType, Index,
StructuredList, StructuredIndex);
numEltsInit += numIElts;
}
}
} }
// OpenCL & AltiVec require all elements to be initialized.
if (numEltsInit != maxElements)
if (SemaRef.getLangOptions().OpenCL || SemaRef.getLangOptions().AltiVec)
SemaRef.Diag(IList->getSourceRange().getBegin(),
diag::err_vector_incorrect_num_initializers)
<< (numEltsInit < maxElements) << maxElements << numEltsInit;
} }
} }

View File

@ -638,20 +638,6 @@ TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
E->getRBraceLoc()); E->getRBraceLoc());
} }
Sema::OwningExprResult
TemplateExprInstantiator::VisitParenListExpr(ParenListExpr *E) {
ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
OwningExprResult Init = Visit(E->getExpr(I));
if (Init.isInvalid())
return SemaRef.ExprError();
Inits.push_back(Init.takeAs<Expr>());
}
return SemaRef.ActOnParenListExpr(E->getLParenLoc(), E->getRParenLoc(),
move_arg(Inits));
}
Sema::OwningExprResult Sema::OwningExprResult
TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) { TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
Designation Desig; Designation Desig;
@ -900,7 +886,7 @@ TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
if (SubExpr.isInvalid()) if (SubExpr.isInvalid())
return SemaRef.ExprError(); return SemaRef.ExprError();
return SemaRef.ActOnCastExpr(/*Scope=*/0, E->getLParenLoc(), return SemaRef.ActOnCastExpr(E->getLParenLoc(),
ExplicitTy.getAsOpaquePtr(), ExplicitTy.getAsOpaquePtr(),
E->getRParenLoc(), E->getRParenLoc(),
move(SubExpr)); move(SubExpr));

View File

@ -1,16 +0,0 @@
// RUN: clang-cc %s -faltivec -verify -pedantic -fsyntax-only -fblocks=0
typedef int v4 __attribute((vector_size(16)));
typedef short v8 __attribute((vector_size(16)));
v8 foo(void) {
v8 a;
v4 b;
a = (v8){4, 2}; // expected-error {{too few elements in vector initialization (expected 8 elements, have 2)}}
b = (v4)(5, 6, 7, 8, 9); // expected-warning {{excess elements in vector initializer}}
b = (v4)(5, 6, 8, 8.0f);
return (v8){0, 1, 2, 3, 1, 2, 3, 4};
// FIXME: test that (type)(fn)(args) still works with -faltivec
// FIXME: test that c++ overloaded commas still work -faltivec
}

View File

@ -385,10 +385,6 @@ OverflowChecking("ftrapv",
llvm::cl::desc("Trap on integer overflow"), llvm::cl::desc("Trap on integer overflow"),
llvm::cl::init(false)); llvm::cl::init(false));
static llvm::cl::opt<bool>
AltiVec("faltivec", llvm::cl::desc("Enable AltiVec vector initializer syntax"),
llvm::cl::init(false));
static llvm::cl::opt<bool> static llvm::cl::opt<bool>
ObjCSenderDispatch("fobjc-sender-dependent-dispatch", ObjCSenderDispatch("fobjc-sender-dependent-dispatch",
llvm::cl::desc("Enable sender-dependent dispatch for" llvm::cl::desc("Enable sender-dependent dispatch for"
@ -505,9 +501,6 @@ static void InitializeLangOptions(LangOptions &Options, LangKind LK){
if (ObjCEnableGCBitmapPrint) if (ObjCEnableGCBitmapPrint)
Options.ObjCGCBitmapPrint = 1; Options.ObjCGCBitmapPrint = 1;
if (AltiVec)
Options.AltiVec = 1;
Options.setVisibilityMode(SymbolVisibility); Options.setVisibilityMode(SymbolVisibility);
Options.OverflowChecking = OverflowChecking; Options.OverflowChecking = OverflowChecking;
} }