[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