diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Expr.cpp | 28 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 9 | ||||
-rw-r--r-- | lib/AST/StmtProfile.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 2 | ||||
-rw-r--r-- | lib/Frontend/PrintParserCallbacks.cpp | 5 | ||||
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 31 | ||||
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 16 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 83 | ||||
-rw-r--r-- | lib/Sema/SemaInit.cpp | 45 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 16 |
11 files changed, 26 insertions, 218 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index ce8bb516c0..2c07de6c79 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1784,26 +1784,6 @@ void DesignatedInitExpr::DoDestroy(ASTContext &C) { 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. //===----------------------------------------------------------------------===// @@ -2008,14 +1988,6 @@ Stmt::child_iterator ImplicitValueInitExpr::child_end() { 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; diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index a2c04978b0..a5b0df8e45 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -850,15 +850,6 @@ void StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 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(); diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index 5d9b8bc7bb..d0f02ae95b 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -245,10 +245,6 @@ void StmtProfiler::VisitParenExpr(ParenExpr *S) { VisitExpr(S); } -void StmtProfiler::VisitParenListExpr(ParenListExpr *S) { - VisitExpr(S); -} - void StmtProfiler::VisitUnaryOperator(UnaryOperator *S) { VisitExpr(S); ID.AddInteger(S->getOpcode()); diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index e761e9f3c7..0eb21c9532 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -475,7 +475,7 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType, } // A scalar can be splatted to an extended vector of the same element type - if (DstType->isExtVectorType() && !SrcType->isVectorType()) { + if (DstType->isExtVectorType() && !isa<VectorType>(SrcType)) { // Cast the scalar to element type QualType EltTy = DstType->getAsExtVectorType()->getElementType(); llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy); diff --git a/lib/Frontend/PrintParserCallbacks.cpp b/lib/Frontend/PrintParserCallbacks.cpp index 2101a85f41..c933a2f320 100644 --- a/lib/Frontend/PrintParserCallbacks.cpp +++ b/lib/Frontend/PrintParserCallbacks.cpp @@ -574,9 +574,8 @@ namespace { Out << __FUNCTION__ << "\n"; return ExprEmpty(); } - virtual OwningExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, - TypeTy *Ty, SourceLocation RParenLoc, - ExprArg Op) { + virtual OwningExprResult ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty, + SourceLocation RParenLoc,ExprArg Op){ Out << __FUNCTION__ << "\n"; return ExprEmpty(); } diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 6e7deef95d..62bd9ae73c 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -407,13 +407,11 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { /// due to member pointers. /// Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, - bool isAddressOfOperand, - bool parseParenAsExprList){ + bool isAddressOfOperand) { bool NotCastExpr; OwningExprResult Res = ParseCastExpression(isUnaryExpression, isAddressOfOperand, - NotCastExpr, - parseParenAsExprList); + NotCastExpr); if (NotCastExpr) Diag(Tok, diag::err_expected_expression); return move(Res); @@ -532,8 +530,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, /// Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, bool isAddressOfOperand, - bool &NotCastExpr, - bool parseParenAsExprList){ + bool &NotCastExpr) { OwningExprResult Res(Actions); tok::TokenKind SavedKind = Tok.getKind(); NotCastExpr = false; @@ -558,7 +555,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, SourceLocation LParenLoc = Tok.getLocation(); SourceLocation RParenLoc; Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/, - parseParenAsExprList, CastTy, RParenLoc); + CastTy, RParenLoc); if (Res.isInvalid()) return move(Res); switch (ParenExprType) { @@ -1024,7 +1021,7 @@ Parser::ParseExprAfterTypeofSizeofAlignof(const Token &OpTok, // operands. EnterExpressionEvaluationContext Unevaluated(Actions, Action::Unevaluated); - Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, false, + Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, CastTy, RParenLoc); CastRange = SourceRange(LParenLoc, RParenLoc); @@ -1281,8 +1278,7 @@ Parser::OwningExprResult Parser::ParseBuiltinPrimaryExpression() { /// Parser::OwningExprResult Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, - bool parseAsExprList, TypeTy *&CastTy, - SourceLocation &RParenLoc) { + TypeTy *&CastTy, SourceLocation &RParenLoc) { assert(Tok.is(tok::l_paren) && "Not a paren expr!"); GreaterThanIsOperatorScope G(GreaterThanIsOperator, true); SourceLocation OpenLoc = ConsumeParen(); @@ -1342,25 +1338,14 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, // Parse the cast-expression that follows it next. // TODO: For cast expression with CastTy. - Result = ParseCastExpression(false, false, true); + Result = ParseCastExpression(false); if (!Result.isInvalid()) - Result = Actions.ActOnCastExpr(CurScope, OpenLoc, CastTy, RParenLoc, - move(Result)); + Result = Actions.ActOnCastExpr(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; diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 46526e47dd..91b4d4d5a9 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -1154,7 +1154,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType, // will be consumed. Result = ParseCastExpression(false/*isUnaryExpression*/, false/*isAddressofOperand*/, - NotCastExpr, false); + NotCastExpr); } // If we parsed a cast-expression, it's really a type-id, otherwise it's @@ -1196,8 +1196,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType, // Result is what ParseCastExpression returned earlier. if (!Result.isInvalid()) - Result = Actions.ActOnCastExpr(CurScope, LParenLoc, CastTy, RParenLoc, - move(Result)); + Result = Actions.ActOnCastExpr(LParenLoc, CastTy, RParenLoc,move(Result)); return move(Result); } diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index e183e3a496..4f7ae7ec0d 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -50,7 +50,6 @@ namespace clang { class Stmt; class Expr; class InitListExpr; - class ParenListExpr; class DesignatedInitExpr; class CallExpr; class DeclRefExpr; @@ -1485,10 +1484,7 @@ public: 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, @@ -1549,14 +1545,8 @@ public: SourceLocation *CommaLocs, SourceLocation RParenLoc); - 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 ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty, + SourceLocation RParenLoc, ExprArg Op); virtual OwningExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, TypeTy *Ty, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 23e58de68c..f00ab5412d 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1918,8 +1918,7 @@ Sema::ActOnArraySubscriptExpr(Scope *S, ExprArg Base, SourceLocation LLoc, << LHSExp->getSourceRange() << RHSExp->getSourceRange()); } // C99 6.5.2.1p1 - if (!(IndexExpr->getType()->isIntegerType() && - IndexExpr->getType()->isScalarType()) && !IndexExpr->isTypeDependent()) + if (!IndexExpr->getType()->isIntegerType() && !IndexExpr->isTypeDependent()) return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer) << IndexExpr->getSourceRange()); @@ -2115,11 +2114,6 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, 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); @@ -2695,11 +2689,6 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc, 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, @@ -3101,7 +3090,7 @@ bool Sema::CheckExtVectorCast(SourceRange R, QualType DestTy, QualType SrcTy) { } Action::OwningExprResult -Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty, +Sema::ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty, SourceLocation RParenLoc, ExprArg Op) { CastExpr::CastKind Kind = CastExpr::CK_Unknown; @@ -3110,10 +3099,6 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty, 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)) @@ -3123,68 +3108,6 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, TypeTy *Ty, 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 @@ -3209,8 +3132,6 @@ QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS, } // 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. diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 1e564ce45f..29113822f7 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -805,47 +805,16 @@ void InitListChecker::CheckVectorType(InitListExpr *IList, QualType DeclType, unsigned &StructuredIndex) { if (Index < IList->getNumInits()) { const VectorType *VT = DeclType->getAsVectorType(); - unsigned maxElements = VT->getNumElements(); - unsigned numEltsInit = 0; + int maxElements = VT->getNumElements(); QualType elementType = VT->getElementType(); - 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; - } - } + 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); } - - // 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; } } diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 7a09210fe0..186c98cf53 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -639,20 +639,6 @@ TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) { } 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; @@ -900,7 +886,7 @@ TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) { if (SubExpr.isInvalid()) return SemaRef.ExprError(); - return SemaRef.ActOnCastExpr(/*Scope=*/0, E->getLParenLoc(), + return SemaRef.ActOnCastExpr(E->getLParenLoc(), ExplicitTy.getAsOpaquePtr(), E->getRParenLoc(), move(SubExpr)); |