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