I'm looking into it now and rolling in Eli's feedback. On Aug 9, 2009, at 8:03 PM, Daniel Dunbar wrote:
> 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<natebege...@mac.com> > 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 >> cfe-commits@cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits