[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/

Nate Begeman natebegeman at mac.com
Mon Aug 10 10:45:24 PDT 2009


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<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