[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