<div dir="ltr">I suspect PR16894 is a duplicate of this.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 15, 2013 at 3:02 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: efriedma<br>
Date: Thu Aug 15 17:02:56 2013<br>
New Revision: 188495<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=188495&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=188495&view=rev</a><br>
Log:<br>
Properly track l-paren of a CXXFucntionalCastExpr.<br>
<br>
In addition to storing more useful information in the AST, this<br>
fixes a semantic check in template instantiation which checks whether<br>
the l-paren location is valid.<br>
<br>
Fixes PR16903.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/ExprCXX.h<br>
    cfe/trunk/lib/AST/Expr.cpp<br>
    cfe/trunk/lib/AST/ExprCXX.cpp<br>
    cfe/trunk/lib/Analysis/ReachableCode.cpp<br>
    cfe/trunk/lib/Sema/SemaCast.cpp<br>
    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
    cfe/trunk/lib/Sema/TreeTransform.h<br>
    cfe/trunk/lib/Serialization/ASTReaderStmt.cpp<br>
    cfe/trunk/lib/Serialization/ASTWriterStmt.cpp<br>
    cfe/trunk/test/SemaTemplate/instantiate-init.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/ExprCXX.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/ExprCXX.h (original)<br>
+++ cfe/trunk/include/clang/AST/ExprCXX.h Thu Aug 15 17:02:56 2013<br>
@@ -1206,17 +1206,16 @@ public:<br>
 ///   x = int(0.5);<br>
 /// \endcode<br>
 class CXXFunctionalCastExpr : public ExplicitCastExpr {<br>
-  SourceLocation TyBeginLoc;<br>
+  SourceLocation LParenLoc;<br>
   SourceLocation RParenLoc;<br>
<br>
   CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,<br>
                         TypeSourceInfo *writtenTy,<br>
-                        SourceLocation tyBeginLoc, CastKind kind,<br>
-                        Expr *castExpr, unsigned pathSize,<br>
-                        SourceLocation rParenLoc)<br>
+                        CastKind kind, Expr *castExpr, unsigned pathSize,<br>
+                        SourceLocation lParenLoc, SourceLocation rParenLoc)<br>
     : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind,<br>
                        castExpr, pathSize, writtenTy),<br>
-      TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}<br>
+      LParenLoc(lParenLoc), RParenLoc(rParenLoc) {}<br>
<br>
   explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)<br>
     : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { }<br>
@@ -1225,22 +1224,20 @@ public:<br>
   static CXXFunctionalCastExpr *Create(ASTContext &Context, QualType T,<br>
                                        ExprValueKind VK,<br>
                                        TypeSourceInfo *Written,<br>
-                                       SourceLocation TyBeginLoc,<br>
                                        CastKind Kind, Expr *Op,<br>
                                        const CXXCastPath *Path,<br>
+                                       SourceLocation LPLoc,<br>
                                        SourceLocation RPLoc);<br>
   static CXXFunctionalCastExpr *CreateEmpty(ASTContext &Context,<br>
                                             unsigned PathSize);<br>
<br>
-  SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }<br>
-  void setTypeBeginLoc(SourceLocation L) { TyBeginLoc = L; }<br>
+  SourceLocation getLParenLoc() const { return LParenLoc; }<br>
+  void setLParenLoc(SourceLocation L) { LParenLoc = L; }<br>
   SourceLocation getRParenLoc() const { return RParenLoc; }<br>
   void setRParenLoc(SourceLocation L) { RParenLoc = L; }<br>
<br>
-  SourceLocation getLocStart() const LLVM_READONLY { return TyBeginLoc; }<br>
-  SourceLocation getLocEnd() const LLVM_READONLY {<br>
-    return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd();<br>
-  }<br>
+  SourceLocation getLocStart() const LLVM_READONLY;<br>
+  SourceLocation getLocEnd() const LLVM_READONLY;<br>
<br>
   static bool classof(const Stmt *T) {<br>
     return T->getStmtClass() == CXXFunctionalCastExprClass;<br>
<br>
Modified: cfe/trunk/lib/AST/Expr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/Expr.cpp (original)<br>
+++ cfe/trunk/lib/AST/Expr.cpp Thu Aug 15 17:02:56 2013<br>
@@ -2177,7 +2177,7 @@ bool Expr::isUnusedResultAWarning(const<br>
     WarnE = this;<br>
     if (const CXXFunctionalCastExpr *CXXCE =<br>
             dyn_cast<CXXFunctionalCastExpr>(this)) {<br>
-      Loc = CXXCE->getTypeBeginLoc();<br>
+      Loc = CXXCE->getLocStart();<br>
       R1 = CXXCE->getSubExpr()->getSourceRange();<br>
     } else {<br>
       const CStyleCastExpr *CStyleCE = cast<CStyleCastExpr>(this);<br>
<br>
Modified: cfe/trunk/lib/AST/ExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/AST/ExprCXX.cpp Thu Aug 15 17:02:56 2013<br>
@@ -660,14 +660,14 @@ CXXConstCastExpr *CXXConstCastExpr::Crea<br>
<br>
 CXXFunctionalCastExpr *<br>
 CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,<br>
-                              TypeSourceInfo *Written, SourceLocation L,<br>
-                              CastKind K, Expr *Op, const CXXCastPath *BasePath,<br>
-                               SourceLocation R) {<br>
+                              TypeSourceInfo *Written, CastKind K, Expr *Op,<br>
+                              const CXXCastPath *BasePath,<br>
+                              SourceLocation L, SourceLocation R) {<br>
   unsigned PathSize = (BasePath ? BasePath->size() : 0);<br>
   void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)<br>
                             + PathSize * sizeof(CXXBaseSpecifier*));<br>
   CXXFunctionalCastExpr *E =<br>
-    new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);<br>
+    new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R);<br>
   if (PathSize) E->setCastPath(*BasePath);<br>
   return E;<br>
 }<br>
@@ -679,6 +679,14 @@ CXXFunctionalCastExpr::CreateEmpty(ASTCo<br>
   return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);<br>
 }<br>
<br>
+SourceLocation CXXFunctionalCastExpr::getLocStart() const {<br>
+  return getTypeInfoAsWritten()->getTypeLoc().getLocStart();<br>
+}<br>
+<br>
+SourceLocation CXXFunctionalCastExpr::getLocEnd() const {<br>
+  return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd();<br>
+}<br>
+<br>
 UserDefinedLiteral::LiteralOperatorKind<br>
 UserDefinedLiteral::getLiteralOperatorKind() const {<br>
   if (getNumArgs() == 0)<br>
<br>
Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/ReachableCode.cpp Thu Aug 15 17:02:56 2013<br>
@@ -227,7 +227,7 @@ static SourceLocation GetUnreachableLoc(<br>
     case Expr::CXXFunctionalCastExprClass: {<br>
       const CXXFunctionalCastExpr *CE = cast <CXXFunctionalCastExpr>(S);<br>
       R1 = CE->getSubExpr()->getSourceRange();<br>
-      return CE->getTypeBeginLoc();<br>
+      return CE->getLocStart();<br>
     }<br>
     case Stmt::CXXTryStmtClass: {<br>
       return cast<CXXTryStmt>(S)->getHandler(0)->getCatchLoc();<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaCast.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaCast.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaCast.cpp Thu Aug 15 17:02:56 2013<br>
@@ -2364,6 +2364,6 @@ ExprResult Sema::BuildCXXFunctionalCastE<br>
     ConstructExpr->setParenRange(SourceRange(LPLoc, RPLoc));<br>
<br>
   return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType,<br>
-                         Op.ValueKind, CastTypeInfo, Op.DestRange.getBegin(),<br>
-                         Op.Kind, Op.SrcExpr.take(), &Op.BasePath, RPLoc));<br>
+                         Op.ValueKind, CastTypeInfo, Op.Kind,<br>
+                         Op.SrcExpr.take(), &Op.BasePath, LPLoc, RPLoc));<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Aug 15 17:02:56 2013<br>
@@ -902,8 +902,9 @@ Sema::BuildCXXTypeConstructExpr(TypeSour<br>
     InitListExpr *List = cast<InitListExpr>(Result.take());<br>
     Result = Owned(CXXFunctionalCastExpr::Create(Context, List->getType(),<br>
                                     Expr::getValueKindForType(TInfo->getType()),<br>
-                                                 TInfo, TyBeginLoc, CK_NoOp,<br>
-                                                 List, /*Path=*/0, RParenLoc));<br>
+                                                 TInfo, CK_NoOp, List,<br>
+                                                 /*Path=*/0,<br>
+                                                 LParenLoc, RParenLoc));<br>
   }<br>
<br>
   // FIXME: Improve AST representation?<br>
<br>
Modified: cfe/trunk/lib/Sema/TreeTransform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/TreeTransform.h (original)<br>
+++ cfe/trunk/lib/Sema/TreeTransform.h Thu Aug 15 17:02:56 2013<br>
@@ -7317,7 +7317,7 @@ TreeTransform<Derived>::TransformCXXFunc<br>
     return SemaRef.Owned(E);<br>
<br>
   return getDerived().RebuildCXXFunctionalCastExpr(Type,<br>
-                                      /*FIXME:*/E->getSubExpr()->getLocStart(),<br>
+                                                   E->getLParenLoc(),<br>
                                                    SubExpr.get(),<br>
                                                    E->getRParenLoc());<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Thu Aug 15 17:02:56 2013<br>
@@ -1263,7 +1263,7 @@ void ASTStmtReader::VisitCXXConstCastExp<br>
<br>
 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));<br>
+  E->setLParenLoc(ReadSourceLocation(Record, Idx));<br>
   E->setRParenLoc(ReadSourceLocation(Record, Idx));<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Thu Aug 15 17:02:56 2013<br>
@@ -1226,7 +1226,7 @@ void ASTStmtWriter::VisitCXXConstCastExp<br>
<br>
 void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);<br>
+  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
   Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
   Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;<br>
 }<br>
<br>
Modified: cfe/trunk/test/SemaTemplate/instantiate-init.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-init.cpp?rev=188495&r1=188494&r2=188495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-init.cpp?rev=188495&r1=188494&r2=188495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaTemplate/instantiate-init.cpp (original)<br>
+++ cfe/trunk/test/SemaTemplate/instantiate-init.cpp Thu Aug 15 17:02:56 2013<br>
@@ -118,3 +118,18 @@ namespace PR13064 {<br>
   template<typename T> struct C { T a = { 0 }; }; // expected-error{{explicit}}<br>
   C<A> c; // expected-note{{here}}<br>
 }<br>
+<br>
+namespace PR16903 {<br>
+  // Make sure we properly instantiate list-initialization.<br>
+  template<typename T><br>
+  void fun (T it) {<br>
+       int m = 0;<br>
+       for (int i = 0; i < 4; ++i, ++it){<br>
+               m |= long{char{*it}};<br>
+       }<br>
+  }<br>
+  int test() {<br>
+       char in[4] = {0,0,0,0};<br>
+       fun(in);<br>
+  }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>