Hi Nate, I reverted this for now, I'm seeing quite a few projects fail to build with it in (in a couple different ways). I believe this is PR4704, and maybe another problem. I attached a couple preprocessed input files which show the other failures to that bug (from dovecot and zsh respectively, emacs and gnudiff are two other things which fail to build).
Sorry! - Daniel On Sun, Aug 9, 2009 at 10:55 AM, Nate Begeman<[email protected]> wrote: > Author: sampo > Date: Sun Aug 9 12:55:44 2009 > New Revision: 78535 > > URL: http://llvm.org/viewvc/llvm-project?rev=78535&view=rev > Log: > AltiVec-style vector initializer syntax, vec4 a = (vec4)(a, b, c, d); > > In addition to being defined by the AltiVec PIM, this is also the vector > initializer syntax used by OpenCL, so that vector literals are compatible > with macro arguments. > > Added: > cfe/trunk/test/Sema/altivec-init.c > Modified: > cfe/trunk/include/clang/AST/Expr.h > cfe/trunk/include/clang/AST/StmtNodes.def > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/include/clang/Parse/Action.h > cfe/trunk/include/clang/Parse/Parser.h > cfe/trunk/lib/AST/Expr.cpp > cfe/trunk/lib/AST/StmtPrinter.cpp > cfe/trunk/lib/AST/StmtProfile.cpp > cfe/trunk/lib/CodeGen/CGExprScalar.cpp > cfe/trunk/lib/Frontend/PrintParserCallbacks.cpp > cfe/trunk/lib/Parse/ParseExpr.cpp > cfe/trunk/lib/Parse/ParseExprCXX.cpp > cfe/trunk/lib/Sema/Sema.h > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/SemaInit.cpp > cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp > cfe/trunk/tools/clang-cc/clang-cc.cpp > > Modified: cfe/trunk/include/clang/AST/Expr.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Expr.h (original) > +++ cfe/trunk/include/clang/AST/Expr.h Sun Aug 9 12:55:44 2009 > @@ -2382,6 +2382,53 @@ > 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 > //===----------------------------------------------------------------------===// > > Modified: cfe/trunk/include/clang/AST/StmtNodes.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtNodes.def?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/StmtNodes.def (original) > +++ cfe/trunk/include/clang/AST/StmtNodes.def Sun Aug 9 12:55:44 2009 > @@ -91,6 +91,7 @@ > EXPR(InitListExpr , Expr) > EXPR(DesignatedInitExpr , Expr) > EXPR(ImplicitValueInitExpr , Expr) > +EXPR(ParenListExpr , Expr) > EXPR(VAArgExpr , Expr) > > // GNU Extensions. > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Aug 9 12:55:44 > 2009 > @@ -2015,6 +2015,9 @@ > "index for __builtin_shufflevector must be less than the total number " > "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< > "level argument for a stack address builtin must be constant">; > > Modified: cfe/trunk/include/clang/Parse/Action.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Parse/Action.h (original) > +++ cfe/trunk/include/clang/Parse/Action.h Sun Aug 9 12:55:44 2009 > @@ -825,6 +825,12 @@ > return move(Val); // Default impl returns operand. > } > > + virtual OwningExprResult ActOnParenListExpr(SourceLocation L, > + SourceLocation R, > + MultiExprArg Val) { > + return ExprEmpty(); > + } > + > // Postfix Expressions. > virtual OwningExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, > tok::TokenKind Kind, > @@ -901,11 +907,12 @@ > return ExprEmpty(); > } > > - virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy > *Ty, > - SourceLocation RParenLoc, ExprArg > Op) { > + virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, > + TypeTy *Ty, SourceLocation > RParenLoc, > + ExprArg Op) { > return ExprEmpty(); > } > - > + > virtual OwningExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, > tok::TokenKind Kind, > ExprArg LHS, ExprArg RHS) { > > Modified: cfe/trunk/include/clang/Parse/Parser.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Parse/Parser.h (original) > +++ cfe/trunk/include/clang/Parse/Parser.h Sun Aug 9 12:55:44 2009 > @@ -705,9 +705,11 @@ > unsigned MinPrec); > OwningExprResult ParseCastExpression(bool isUnaryExpression, > bool isAddressOfOperand, > - bool &NotCastExpr); > + bool &NotCastExpr, > + bool parseParenAsExprList); > OwningExprResult ParseCastExpression(bool isUnaryExpression, > - bool isAddressOfOperand = false); > + bool isAddressOfOperand = false, > + bool parseParenAsExprList = false); > OwningExprResult ParsePostfixExpressionSuffix(OwningExprResult LHS); > OwningExprResult ParseSizeofAlignofExpression(); > OwningExprResult ParseBuiltinPrimaryExpression(); > @@ -733,6 +735,7 @@ > }; > OwningExprResult ParseParenExpression(ParenParseOption &ExprType, > bool stopIfCastExpr, > + bool parseAsExprList, > TypeTy *&CastTy, > SourceLocation &RParenLoc); > > > Modified: cfe/trunk/lib/AST/Expr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Expr.cpp (original) > +++ cfe/trunk/lib/AST/Expr.cpp Sun Aug 9 12:55:44 2009 > @@ -1784,6 +1784,26 @@ > 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. > //===----------------------------------------------------------------------===// > @@ -1988,6 +2008,14 @@ > return child_iterator(); > } > > +// ParenListExpr > +Stmt::child_iterator ParenListExpr::child_begin() { > + return &Exprs[0]; > +} > +Stmt::child_iterator ParenListExpr::child_end() { > + return &Exprs[0]+NumExprs; > +} > + > // ObjCStringLiteral > Stmt::child_iterator ObjCStringLiteral::child_begin() { > return &String; > > Modified: cfe/trunk/lib/AST/StmtPrinter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) > +++ cfe/trunk/lib/AST/StmtPrinter.cpp Sun Aug 9 12:55:44 2009 > @@ -850,6 +850,15 @@ > 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) { > for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), > DEnd = Node->designators_end(); > > Modified: cfe/trunk/lib/AST/StmtProfile.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtProfile.cpp (original) > +++ cfe/trunk/lib/AST/StmtProfile.cpp Sun Aug 9 12:55:44 2009 > @@ -245,6 +245,10 @@ > VisitExpr(S); > } > > +void StmtProfiler::VisitParenListExpr(ParenListExpr *S) { > + VisitExpr(S); > +} > + > void StmtProfiler::VisitUnaryOperator(UnaryOperator *S) { > VisitExpr(S); > ID.AddInteger(S->getOpcode()); > > Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Sun Aug 9 12:55:44 2009 > @@ -467,7 +467,7 @@ > } > > // A scalar can be splatted to an extended vector of the same element type > - if (DstType->isExtVectorType() && !isa<VectorType>(SrcType)) { > + if (DstType->isExtVectorType() && !SrcType->isVectorType()) { > // Cast the scalar to element type > QualType EltTy = DstType->getAsExtVectorType()->getElementType(); > llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy); > > Modified: cfe/trunk/lib/Frontend/PrintParserCallbacks.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintParserCallbacks.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Frontend/PrintParserCallbacks.cpp (original) > +++ cfe/trunk/lib/Frontend/PrintParserCallbacks.cpp Sun Aug 9 12:55:44 2009 > @@ -574,8 +574,9 @@ > Out << __FUNCTION__ << "\n"; > return ExprEmpty(); > } > - virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy > *Ty, > - SourceLocation RParenLoc,ExprArg > Op){ > + virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation > LParenLoc, > + TypeTy *Ty, SourceLocation > RParenLoc, > + ExprArg Op) { > Out << __FUNCTION__ << "\n"; > return ExprEmpty(); > } > > Modified: cfe/trunk/lib/Parse/ParseExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Parse/ParseExpr.cpp (original) > +++ cfe/trunk/lib/Parse/ParseExpr.cpp Sun Aug 9 12:55:44 2009 > @@ -407,11 +407,13 @@ > /// due to member pointers. > /// > Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, > - bool > isAddressOfOperand) { > + bool isAddressOfOperand, > + bool > parseParenAsExprList){ > bool NotCastExpr; > OwningExprResult Res = ParseCastExpression(isUnaryExpression, > isAddressOfOperand, > - NotCastExpr); > + NotCastExpr, > + parseParenAsExprList); > if (NotCastExpr) > Diag(Tok, diag::err_expected_expression); > return move(Res); > @@ -530,7 +532,8 @@ > /// > Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, > bool isAddressOfOperand, > - bool &NotCastExpr) { > + bool &NotCastExpr, > + bool > parseParenAsExprList){ > OwningExprResult Res(Actions); > tok::TokenKind SavedKind = Tok.getKind(); > NotCastExpr = false; > @@ -555,7 +558,7 @@ > SourceLocation LParenLoc = Tok.getLocation(); > SourceLocation RParenLoc; > Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/, > - CastTy, RParenLoc); > + parseParenAsExprList, CastTy, RParenLoc); > if (Res.isInvalid()) return move(Res); > > switch (ParenExprType) { > @@ -1021,7 +1024,7 @@ > // operands. > EnterExpressionEvaluationContext Unevaluated(Actions, > Action::Unevaluated); > - Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, > + Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, false, > CastTy, RParenLoc); > CastRange = SourceRange(LParenLoc, RParenLoc); > > @@ -1278,7 +1281,8 @@ > /// > Parser::OwningExprResult > Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, > - TypeTy *&CastTy, SourceLocation &RParenLoc) { > + bool parseAsExprList, TypeTy *&CastTy, > + SourceLocation &RParenLoc) { > assert(Tok.is(tok::l_paren) && "Not a paren expr!"); > GreaterThanIsOperatorScope G(GreaterThanIsOperator, true); > SourceLocation OpenLoc = ConsumeParen(); > @@ -1338,14 +1342,25 @@ > > // Parse the cast-expression that follows it next. > // TODO: For cast expression with CastTy. > - Result = ParseCastExpression(false); > + Result = ParseCastExpression(false, false, true); > if (!Result.isInvalid()) > - Result = Actions.ActOnCastExpr(OpenLoc, CastTy, > RParenLoc,move(Result)); > + Result = Actions.ActOnCastExpr(CurScope, OpenLoc, CastTy, RParenLoc, > + move(Result)); > return move(Result); > } > > Diag(Tok, diag::err_expected_lbrace_in_compound_literal); > 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 { > Result = ParseExpression(); > ExprType = SimpleExpr; > > Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original) > +++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Sun Aug 9 12:55:44 2009 > @@ -1154,7 +1154,7 @@ > // will be consumed. > Result = ParseCastExpression(false/*isUnaryExpression*/, > false/*isAddressofOperand*/, > - NotCastExpr); > + NotCastExpr, false); > } > > // If we parsed a cast-expression, it's really a type-id, otherwise it's > @@ -1196,7 +1196,8 @@ > > // Result is what ParseCastExpression returned earlier. > if (!Result.isInvalid()) > - Result = Actions.ActOnCastExpr(LParenLoc, CastTy, > RParenLoc,move(Result)); > + Result = Actions.ActOnCastExpr(CurScope, LParenLoc, CastTy, RParenLoc, > + move(Result)); > return move(Result); > } > > > Modified: cfe/trunk/lib/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/Sema.h (original) > +++ cfe/trunk/lib/Sema/Sema.h Sun Aug 9 12:55:44 2009 > @@ -50,6 +50,7 @@ > class Stmt; > class Expr; > class InitListExpr; > + class ParenListExpr; > class DesignatedInitExpr; > class CallExpr; > class DeclRefExpr; > @@ -1484,7 +1485,10 @@ > virtual OwningExprResult ActOnCharacterConstant(const Token &); > virtual OwningExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, > ExprArg Val); > - > + virtual OwningExprResult ActOnParenListExpr(SourceLocation L, > + SourceLocation R, > + MultiExprArg Val); > + > /// ActOnStringLiteral - The specified tokens were lexed as pasted string > /// fragments (e.g. "foo" "bar" L"baz"). > virtual OwningExprResult ActOnStringLiteral(const Token *Toks, > @@ -1545,8 +1549,14 @@ > SourceLocation *CommaLocs, > SourceLocation RParenLoc); > > - virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy > *Ty, > - SourceLocation RParenLoc, ExprArg > Op); > + virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, > + TypeTy *Ty, SourceLocation > RParenLoc, > + 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, > TypeTy *Ty, > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Sun Aug 9 12:55:44 2009 > @@ -1918,7 +1918,8 @@ > << LHSExp->getSourceRange() << RHSExp->getSourceRange()); > } > // C99 6.5.2.1p1 > - if (!IndexExpr->getType()->isIntegerType() && > !IndexExpr->isTypeDependent()) > + if (!(IndexExpr->getType()->isIntegerType() && > + IndexExpr->getType()->isScalarType()) && > !IndexExpr->isTypeDependent()) > return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer) > << IndexExpr->getSourceRange()); > > @@ -2114,6 +2115,11 @@ > Expr *BaseExpr = Base.takeAs<Expr>(); > 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. > DefaultFunctionArrayConversion(BaseExpr); > > @@ -2689,6 +2695,11 @@ > FunctionDecl *FDecl = NULL; > NamedDecl *NDecl = NULL; > 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) { > // Determine whether this is a dependent call inside a C++ template, > @@ -3090,7 +3101,7 @@ > } > > Action::OwningExprResult > -Sema::ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty, > +Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty, > SourceLocation RParenLoc, ExprArg Op) { > CastExpr::CastKind Kind = CastExpr::CK_Unknown; > > @@ -3099,6 +3110,10 @@ > > Expr *castExpr = Op.takeAs<Expr>(); > 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, > Kind)) > @@ -3108,6 +3123,68 @@ > 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. > /// In that case, lhs = cond. > /// C99 6.5.15 > @@ -3132,6 +3209,8 @@ > } > > // 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 > // to find a common type: C99 6.5.15p3,5. > > Modified: cfe/trunk/lib/Sema/SemaInit.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaInit.cpp (original) > +++ cfe/trunk/lib/Sema/SemaInit.cpp Sun Aug 9 12:55:44 2009 > @@ -805,16 +805,47 @@ > unsigned &StructuredIndex) { > if (Index < IList->getNumInits()) { > const VectorType *VT = DeclType->getAsVectorType(); > - int maxElements = VT->getNumElements(); > + unsigned maxElements = VT->getNumElements(); > + unsigned numEltsInit = 0; > QualType elementType = VT->getElementType(); > > - for (int i = 0; i < maxElements; ++i) { > - // Don't attempt to go past the end of the init list > - if (Index >= IList->getNumInits()) > - break; > - CheckSubElementType(IList, elementType, Index, > - StructuredList, StructuredIndex); > + if (!SemaRef.getLangOptions().OpenCL) { > + for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { > + // Don't attempt to go past the end of the init list > + if (Index >= IList->getNumInits()) > + break; > + CheckSubElementType(IList, elementType, Index, > + 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; > } > } > > > Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp Sun Aug 9 12:55:44 > 2009 > @@ -639,6 +639,20 @@ > } > > 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 > TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) { > Designation Desig; > > @@ -886,7 +900,7 @@ > if (SubExpr.isInvalid()) > return SemaRef.ExprError(); > > - return SemaRef.ActOnCastExpr(E->getLParenLoc(), > + return SemaRef.ActOnCastExpr(/*Scope=*/0, E->getLParenLoc(), > ExplicitTy.getAsOpaquePtr(), > E->getRParenLoc(), > move(SubExpr)); > > Added: cfe/trunk/test/Sema/altivec-init.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/altivec-init.c?rev=78535&view=auto > > ============================================================================== > --- cfe/trunk/test/Sema/altivec-init.c (added) > +++ cfe/trunk/test/Sema/altivec-init.c Sun Aug 9 12:55:44 2009 > @@ -0,0 +1,16 @@ > +// 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 > +} > > Modified: cfe/trunk/tools/clang-cc/clang-cc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-cc/clang-cc.cpp?rev=78535&r1=78534&r2=78535&view=diff > > ============================================================================== > --- cfe/trunk/tools/clang-cc/clang-cc.cpp (original) > +++ cfe/trunk/tools/clang-cc/clang-cc.cpp Sun Aug 9 12:55:44 2009 > @@ -386,6 +386,10 @@ > 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> > ObjCSenderDispatch("fobjc-sender-dependent-dispatch", > llvm::cl::desc("Enable sender-dependent > dispatch for" > "Objective-C messages"), > llvm::cl::init(false)); > @@ -501,6 +505,9 @@ > if (ObjCEnableGCBitmapPrint) > Options.ObjCGCBitmapPrint = 1; > > + if (AltiVec) > + Options.AltiVec = 1; > + > Options.setVisibilityMode(SymbolVisibility); > Options.OverflowChecking = OverflowChecking; > } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
