I suspect PR16894 is a duplicate of this.
On Thu, Aug 15, 2013 at 3:02 PM, Eli Friedman <[email protected]>wrote: > Author: efriedma > Date: Thu Aug 15 17:02:56 2013 > New Revision: 188495 > > URL: http://llvm.org/viewvc/llvm-project?rev=188495&view=rev > Log: > Properly track l-paren of a CXXFucntionalCastExpr. > > In addition to storing more useful information in the AST, this > fixes a semantic check in template instantiation which checks whether > the l-paren location is valid. > > Fixes PR16903. > > Modified: > cfe/trunk/include/clang/AST/ExprCXX.h > cfe/trunk/lib/AST/Expr.cpp > cfe/trunk/lib/AST/ExprCXX.cpp > cfe/trunk/lib/Analysis/ReachableCode.cpp > cfe/trunk/lib/Sema/SemaCast.cpp > cfe/trunk/lib/Sema/SemaExprCXX.cpp > cfe/trunk/lib/Sema/TreeTransform.h > cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > cfe/trunk/test/SemaTemplate/instantiate-init.cpp > > Modified: cfe/trunk/include/clang/AST/ExprCXX.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/ExprCXX.h (original) > +++ cfe/trunk/include/clang/AST/ExprCXX.h Thu Aug 15 17:02:56 2013 > @@ -1206,17 +1206,16 @@ public: > /// x = int(0.5); > /// \endcode > class CXXFunctionalCastExpr : public ExplicitCastExpr { > - SourceLocation TyBeginLoc; > + SourceLocation LParenLoc; > SourceLocation RParenLoc; > > CXXFunctionalCastExpr(QualType ty, ExprValueKind VK, > TypeSourceInfo *writtenTy, > - SourceLocation tyBeginLoc, CastKind kind, > - Expr *castExpr, unsigned pathSize, > - SourceLocation rParenLoc) > + CastKind kind, Expr *castExpr, unsigned pathSize, > + SourceLocation lParenLoc, SourceLocation > rParenLoc) > : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind, > castExpr, pathSize, writtenTy), > - TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} > + LParenLoc(lParenLoc), RParenLoc(rParenLoc) {} > > explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize) > : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { } > @@ -1225,22 +1224,20 @@ public: > static CXXFunctionalCastExpr *Create(ASTContext &Context, QualType T, > ExprValueKind VK, > TypeSourceInfo *Written, > - SourceLocation TyBeginLoc, > CastKind Kind, Expr *Op, > const CXXCastPath *Path, > + SourceLocation LPLoc, > SourceLocation RPLoc); > static CXXFunctionalCastExpr *CreateEmpty(ASTContext &Context, > unsigned PathSize); > > - SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } > - void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; } > + SourceLocation getLParenLoc() const { return LParenLoc; } > + void setLParenLoc(SourceLocation L) { LParenLoc = L; } > SourceLocation getRParenLoc() const { return RParenLoc; } > void setRParenLoc(SourceLocation L) { RParenLoc = L; } > > - SourceLocation getLocStart() const LLVM_READONLY { return TyBeginLoc; } > - SourceLocation getLocEnd() const LLVM_READONLY { > - return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd(); > - } > + SourceLocation getLocStart() const LLVM_READONLY; > + SourceLocation getLocEnd() const LLVM_READONLY; > > static bool classof(const Stmt *T) { > return T->getStmtClass() == CXXFunctionalCastExprClass; > > Modified: cfe/trunk/lib/AST/Expr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Expr.cpp (original) > +++ cfe/trunk/lib/AST/Expr.cpp Thu Aug 15 17:02:56 2013 > @@ -2177,7 +2177,7 @@ bool Expr::isUnusedResultAWarning(const > WarnE = this; > if (const CXXFunctionalCastExpr *CXXCE = > dyn_cast<CXXFunctionalCastExpr>(this)) { > - Loc = CXXCE->getTypeBeginLoc(); > + Loc = CXXCE->getLocStart(); > R1 = CXXCE->getSubExpr()->getSourceRange(); > } else { > const CStyleCastExpr *CStyleCE = cast<CStyleCastExpr>(this); > > Modified: cfe/trunk/lib/AST/ExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ExprCXX.cpp (original) > +++ cfe/trunk/lib/AST/ExprCXX.cpp Thu Aug 15 17:02:56 2013 > @@ -660,14 +660,14 @@ CXXConstCastExpr *CXXConstCastExpr::Crea > > CXXFunctionalCastExpr * > CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK, > - TypeSourceInfo *Written, SourceLocation L, > - CastKind K, Expr *Op, const CXXCastPath > *BasePath, > - SourceLocation R) { > + TypeSourceInfo *Written, CastKind K, Expr > *Op, > + const CXXCastPath *BasePath, > + SourceLocation L, SourceLocation R) { > unsigned PathSize = (BasePath ? BasePath->size() : 0); > void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr) > + PathSize * sizeof(CXXBaseSpecifier*)); > CXXFunctionalCastExpr *E = > - new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, > PathSize, R); > + new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, > L, R); > if (PathSize) E->setCastPath(*BasePath); > return E; > } > @@ -679,6 +679,14 @@ CXXFunctionalCastExpr::CreateEmpty(ASTCo > return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize); > } > > +SourceLocation CXXFunctionalCastExpr::getLocStart() const { > + return getTypeInfoAsWritten()->getTypeLoc().getLocStart(); > +} > + > +SourceLocation CXXFunctionalCastExpr::getLocEnd() const { > + return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd(); > +} > + > UserDefinedLiteral::LiteralOperatorKind > UserDefinedLiteral::getLiteralOperatorKind() const { > if (getNumArgs() == 0) > > Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Analysis/ReachableCode.cpp (original) > +++ cfe/trunk/lib/Analysis/ReachableCode.cpp Thu Aug 15 17:02:56 2013 > @@ -227,7 +227,7 @@ static SourceLocation GetUnreachableLoc( > case Expr::CXXFunctionalCastExprClass: { > const CXXFunctionalCastExpr *CE = cast <CXXFunctionalCastExpr>(S); > R1 = CE->getSubExpr()->getSourceRange(); > - return CE->getTypeBeginLoc(); > + return CE->getLocStart(); > } > case Stmt::CXXTryStmtClass: { > return cast<CXXTryStmt>(S)->getHandler(0)->getCatchLoc(); > > Modified: cfe/trunk/lib/Sema/SemaCast.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaCast.cpp (original) > +++ cfe/trunk/lib/Sema/SemaCast.cpp Thu Aug 15 17:02:56 2013 > @@ -2364,6 +2364,6 @@ ExprResult Sema::BuildCXXFunctionalCastE > ConstructExpr->setParenRange(SourceRange(LPLoc, RPLoc)); > > return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType, > - Op.ValueKind, CastTypeInfo, > Op.DestRange.getBegin(), > - Op.Kind, Op.SrcExpr.take(), &Op.BasePath, > RPLoc)); > + Op.ValueKind, CastTypeInfo, Op.Kind, > + Op.SrcExpr.take(), &Op.BasePath, LPLoc, RPLoc)); > } > > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Aug 15 17:02:56 2013 > @@ -902,8 +902,9 @@ Sema::BuildCXXTypeConstructExpr(TypeSour > InitListExpr *List = cast<InitListExpr>(Result.take()); > Result = Owned(CXXFunctionalCastExpr::Create(Context, List->getType(), > > Expr::getValueKindForType(TInfo->getType()), > - TInfo, TyBeginLoc, > CK_NoOp, > - List, /*Path=*/0, > RParenLoc)); > + TInfo, CK_NoOp, List, > + /*Path=*/0, > + LParenLoc, RParenLoc)); > } > > // FIXME: Improve AST representation? > > Modified: cfe/trunk/lib/Sema/TreeTransform.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TreeTransform.h (original) > +++ cfe/trunk/lib/Sema/TreeTransform.h Thu Aug 15 17:02:56 2013 > @@ -7317,7 +7317,7 @@ TreeTransform<Derived>::TransformCXXFunc > return SemaRef.Owned(E); > > return getDerived().RebuildCXXFunctionalCastExpr(Type, > - > /*FIXME:*/E->getSubExpr()->getLocStart(), > + E->getLParenLoc(), > SubExpr.get(), > E->getRParenLoc()); > } > > Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Thu Aug 15 17:02:56 2013 > @@ -1263,7 +1263,7 @@ void ASTStmtReader::VisitCXXConstCastExp > > void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { > VisitExplicitCastExpr(E); > - E->setTypeBeginLoc(ReadSourceLocation(Record, Idx)); > + E->setLParenLoc(ReadSourceLocation(Record, Idx)); > E->setRParenLoc(ReadSourceLocation(Record, Idx)); > } > > > Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Thu Aug 15 17:02:56 2013 > @@ -1226,7 +1226,7 @@ void ASTStmtWriter::VisitCXXConstCastExp > > void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { > VisitExplicitCastExpr(E); > - Writer.AddSourceLocation(E->getTypeBeginLoc(), Record); > + Writer.AddSourceLocation(E->getLParenLoc(), Record); > Writer.AddSourceLocation(E->getRParenLoc(), Record); > Code = serialization::EXPR_CXX_FUNCTIONAL_CAST; > } > > Modified: cfe/trunk/test/SemaTemplate/instantiate-init.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-init.cpp?rev=188495&r1=188494&r2=188495&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaTemplate/instantiate-init.cpp (original) > +++ cfe/trunk/test/SemaTemplate/instantiate-init.cpp Thu Aug 15 17:02:56 > 2013 > @@ -118,3 +118,18 @@ namespace PR13064 { > template<typename T> struct C { T a = { 0 }; }; // > expected-error{{explicit}} > C<A> c; // expected-note{{here}} > } > + > +namespace PR16903 { > + // Make sure we properly instantiate list-initialization. > + template<typename T> > + void fun (T it) { > + int m = 0; > + for (int i = 0; i < 4; ++i, ++it){ > + m |= long{char{*it}}; > + } > + } > + int test() { > + char in[4] = {0,0,0,0}; > + fun(in); > + } > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
