[cfe-commits] r78535 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ include/clang/Parse/ lib/AST/ lib/CodeGen/ lib/Frontend/ lib/Parse/ lib/Sema/ test/Sema/ tools/clang-cc/
Daniel Dunbar
daniel at zuster.org
Sun Aug 9 20:03:12 PDT 2009
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<natebegeman at 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 at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list