r188495 - Properly track l-paren of a CXXFucntionalCastExpr.
Richard Smith
richard at metafoo.co.uk
Thu Aug 15 15:09:06 PDT 2013
I suspect PR16894 is a duplicate of this.
On Thu, Aug 15, 2013 at 3:02 PM, Eli Friedman <eli.friedman at gmail.com>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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130815/f74d83b8/attachment.html>
More information about the cfe-commits
mailing list