<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>