<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Crash when parsing a recursive decltype() return"
   href="http://llvm.org/bugs/show_bug.cgi?id=15346">15346</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Crash when parsing a recursive decltype() return
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Macintosh
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>MacOS X
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++11
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>alexmac@adobe.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=10068" name="attach_10068" title="testcase showing the crash">attachment 10068</a> <a href="attachment.cgi?id=10068&action=edit" title="testcase showing the crash">[details]</a></span>
testcase showing the crash

Compiling the attached cut-down test case results in a crash, but I would
expect a compile error instead (might be a stack overflow due to the recursion
in the decltype expression?)

Command: clang -cc1 -std=c++11 b2.cpp 

Stack trace:

* thread #1: tid = 0x1c03, 0x000000010097e9a8
clang`DeduceTemplateArgumentsByTypeMatch(S=0x0000000108045200,
TemplateParams=0x0000000108062528, ParamIn=(null), ArgIn=(null),
Info=0x00007fff5f401658, Deduced=0x00007fff5f4013c8, TDF=13,
PartialOrdering=false, RefParamComparisons=0x0000000000000000) + 104 at
SemaTemplateDeduction.cpp:909, stop reason = EXC_BAD_ACCESS (code=2,
address=0x7fff5f3ffd38)
    frame #0: 0x000000010097e9a8
clang`DeduceTemplateArgumentsByTypeMatch(S=0x0000000108045200,
TemplateParams=0x0000000108062528, ParamIn=(null), ArgIn=(null),
Info=0x00007fff5f401658, Deduced=0x00007fff5f4013c8, TDF=13,
PartialOrdering=false, RefParamComparisons=0x0000000000000000) + 104 at
SemaTemplateDeduction.cpp:909
    frame #1: 0x000000010097d553
clang`clang::Sema::DeduceTemplateArguments(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, ExplicitTemplateArgs=0x0000000000000000,
Args=(null), Specialization=0x00007fff5f401648, Info=0x00007fff5f401658) + 1763
at SemaTemplateDeduction.cpp:3172
    frame #2: 0x000000010089f031
clang`clang::Sema::AddTemplateOverloadCandidate(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, FoundDecl=(null),
ExplicitTemplateArgs=0x0000000000000000, Args=(null),
CandidateSet=0x00007fff5f402020, SuppressUserConversions=false) + 241 at
SemaOverload.cpp:5669
    frame #3: 0x00000001008a6c24
clang`clang::Sema::AddArgumentDependentLookupCandidates(this=0x0000000108045200,
Name=(null), Operator=true, Loc=(null), Args=(null),
ExplicitTemplateArgs=0x0000000000000000, CandidateSet=0x00007fff5f402020,
PartialOverloading=false) + 868 at SemaOverload.cpp:7775
    frame #4: 0x00000001008aedbe
clang`clang::Sema::CreateOverloadedBinOp(this=0x0000000108045200, OpLoc=(null),
OpcIn=3, Fns=0x00007fff5f403538, LHS=0x0000000000000000,
RHS=0x0000000000000000) + 2302 at SemaOverload.cpp:10306
    frame #5: 0x0000000100757ee8
clang`BuildOverloadedBinOp(S=0x0000000108045200, Sc=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHS=0x0000000108186388, RHS=0x00000001081863b0) + 280
at SemaExpr.cpp:8737
    frame #6: 0x0000000100757d82
clang`clang::Sema::BuildBinOp(this=0x0000000108045200, S=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHSExpr=0x0000000108186388,
RHSExpr=0x00000001081863b0) + 1218 at SemaExpr.cpp:8811
    frame #7: 0x00000001009e5279
clang`clang::TreeTransform<(this=0x00007fff5f404640, OpLoc=(null), Opc=BO_Div,
LHS=0x0000000108186388,
RHS=0x00000001081863b0)::TemplateInstantiator>::RebuildBinaryOperator(clang::SourceLocation,
clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) + 73 at
TreeTransform.h:1578
    frame #8: 0x00000001009d13f2
clang`clang::TreeTransform<(this=0x00007fff5f404640,
E=0x0000000108062878)::TemplateInstantiator>::TransformBinaryOperator(clang::BinaryOperator*)
+ 466 at TreeTransform.h:6534
    frame #9: 0x00000001009c6fee
clang`clang::TreeTransform<(this=0x00007fff5f404640,
E=0x0000000108062878)::TemplateInstantiator>::TransformExpr(clang::Expr*) + 510
at StmtNodes.inc:151
    frame #10: 0x00000001009ee0b9
clang`clang::TreeTransform<(this=0x00007fff5f404640, TLB=0x00007fff5f4045f0,
TL=(null))::TemplateInstantiator>::TransformDecltypeType(clang::TypeLocBuilder&,
clang::DecltypeTypeLoc) + 137 at TreeTransform.h:4427
    frame #11: 0x00000001009c0601
clang`clang::TreeTransform<(this=0x00007fff5f404640, TLB=0x00007fff5f4045f0,
T=(null))::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) + 2273 at TypeNodes.def:86
    frame #12: 0x00000001009f3a84
clang`clang::TreeTransform<(this=0x00007fff5f404640, TLB=0x00007fff5f4045f0,
TL=(null), ThisContext=0x0000000000000000,
ThisTypeQuals=0)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, unsigned int) + 468 at
TreeTransform.h:4244
    frame #13: 0x00000001009c1556 clang`(this=0x00007fff5f404640,
TLB=0x00007fff5f4045f0, TL=(null), ThisContext=0x0000000000000000,
ThisTypeQuals=0)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, unsigned int) + 150 at
SemaTemplateInstantiate.cpp:1363
    frame #14: 0x00000001009c11d0
clang`clang::Sema::SubstFunctionDeclType(this=0x0000000108045200,
T=0x0000000108062960, Args=0x00007fff5f405528, Loc=(null), Entity=(null),
ThisContext=0x0000000000000000, ThisTypeQuals=0) + 496 at
SemaTemplateInstantiate.cpp:1622
    frame #15: 0x0000000100a06f36
clang`clang::TemplateDeclInstantiator::SubstFunctionType(this=0x00007fff5f4051d0,
D=0x0000000108062990, Params=0x00007fff5f405058) + 454 at
SemaTemplateInstantiateDecl.cpp:2370
    frame #16: 0x0000000100a0567f
clang`clang::TemplateDeclInstantiator::VisitFunctionDecl(this=0x00007fff5f4051d0,
D=0x0000000108062990, TemplateParams=0x0000000000000000) + 479 at
SemaTemplateInstantiateDecl.cpp:1135
    frame #17: 0x00000001009f4ea7
clang`clang::declvisitor::Base<clang::declvisitor::make_ptr,
clang::TemplateDeclInstantiator, clang::Decl*>::Visit(this=0x00007fff5f4051d0,
D=0x0000000108062990) + 1191 at DeclNodes.inc:333
    frame #18: 0x0000000100a0a454
clang`clang::Sema::SubstDecl(this=0x0000000108045200, D=0x0000000108062990,
Owner=0x0000000108061d68, TemplateArgs=0x00007fff5f405528) + 132 at
SemaTemplateInstantiateDecl.cpp:2192
    frame #19: 0x000000010097c02b
clang`clang::Sema::FinishTemplateArgumentDeduction(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, Deduced=0x00007fff5f406118,
NumExplicitlySpecified=0, Specialization=0x00007fff5f406398,
Info=0x00007fff5f4063a8, OriginalCallArgs=0x00007fff5f406040) + 2859 at
SemaTemplateDeduction.cpp:2712
    frame #20: 0x000000010097dfd9
clang`clang::Sema::DeduceTemplateArguments(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, ExplicitTemplateArgs=0x0000000000000000,
Args=(null), Specialization=0x00007fff5f406398, Info=0x00007fff5f4063a8) + 4457
at SemaTemplateDeduction.cpp:3291
    frame #21: 0x000000010089f031
clang`clang::Sema::AddTemplateOverloadCandidate(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, FoundDecl=(null),
ExplicitTemplateArgs=0x0000000000000000, Args=(null),
CandidateSet=0x00007fff5f406d70, SuppressUserConversions=false) + 241 at
SemaOverload.cpp:5669
    frame #22: 0x00000001008a6c24
clang`clang::Sema::AddArgumentDependentLookupCandidates(this=0x0000000108045200,
Name=(null), Operator=true, Loc=(null), Args=(null),
ExplicitTemplateArgs=0x0000000000000000, CandidateSet=0x00007fff5f406d70,
PartialOverloading=false) + 868 at SemaOverload.cpp:7775
    frame #23: 0x00000001008aedbe
clang`clang::Sema::CreateOverloadedBinOp(this=0x0000000108045200, OpLoc=(null),
OpcIn=3, Fns=0x00007fff5f408288, LHS=0x0000000000000000,
RHS=0x0000000000000000) + 2302 at SemaOverload.cpp:10306
    frame #24: 0x0000000100757ee8
clang`BuildOverloadedBinOp(S=0x0000000108045200, Sc=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHS=0x00000001081860f8, RHS=0x0000000108186120) + 280
at SemaExpr.cpp:8737
    frame #25: 0x0000000100757d82
clang`clang::Sema::BuildBinOp(this=0x0000000108045200, S=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHSExpr=0x00000001081860f8,
RHSExpr=0x0000000108186120) + 1218 at SemaExpr.cpp:8811
    frame #26: 0x00000001009e5279
clang`clang::TreeTransform<(this=0x00007fff5f409390, OpLoc=(null), Opc=BO_Div,
LHS=0x00000001081860f8,
RHS=0x0000000108186120)::TemplateInstantiator>::RebuildBinaryOperator(clang::SourceLocation,
clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) + 73 at
TreeTransform.h:1578
    frame #27: 0x00000001009d13f2
clang`clang::TreeTransform<(this=0x00007fff5f409390,
E=0x0000000108062878)::TemplateInstantiator>::TransformBinaryOperator(clang::BinaryOperator*)
+ 466 at TreeTransform.h:6534
    frame #28: 0x00000001009c6fee
clang`clang::TreeTransform<(this=0x00007fff5f409390,
E=0x0000000108062878)::TemplateInstantiator>::TransformExpr(clang::Expr*) + 510
at StmtNodes.inc:151
    frame #29: 0x00000001009ee0b9
clang`clang::TreeTransform<(this=0x00007fff5f409390, TLB=0x00007fff5f409340,
TL=(null))::TemplateInstantiator>::TransformDecltypeType(clang::TypeLocBuilder&,
clang::DecltypeTypeLoc) + 137 at TreeTransform.h:4427
    frame #30: 0x00000001009c0601
clang`clang::TreeTransform<(this=0x00007fff5f409390, TLB=0x00007fff5f409340,
T=(null))::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) + 2273 at TypeNodes.def:86
    frame #31: 0x00000001009f3a84
clang`clang::TreeTransform<(this=0x00007fff5f409390, TLB=0x00007fff5f409340,
TL=(null), ThisContext=0x0000000000000000,
ThisTypeQuals=0)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, unsigned int) + 468 at
TreeTransform.h:4244
    frame #32: 0x00000001009c1556 clang`(this=0x00007fff5f409390,
TLB=0x00007fff5f409340, TL=(null), ThisContext=0x0000000000000000,
ThisTypeQuals=0)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, unsigned int) + 150 at
SemaTemplateInstantiate.cpp:1363
    frame #33: 0x00000001009c11d0
clang`clang::Sema::SubstFunctionDeclType(this=0x0000000108045200,
T=0x0000000108062960, Args=0x00007fff5f40a278, Loc=(null), Entity=(null),
ThisContext=0x0000000000000000, ThisTypeQuals=0) + 496 at
SemaTemplateInstantiate.cpp:1622
    frame #34: 0x0000000100a06f36
clang`clang::TemplateDeclInstantiator::SubstFunctionType(this=0x00007fff5f409f20,
D=0x0000000108062990, Params=0x00007fff5f409da8) + 454 at
SemaTemplateInstantiateDecl.cpp:2370
    frame #35: 0x0000000100a0567f
clang`clang::TemplateDeclInstantiator::VisitFunctionDecl(this=0x00007fff5f409f20,
D=0x0000000108062990, TemplateParams=0x0000000000000000) + 479 at
SemaTemplateInstantiateDecl.cpp:1135
    frame #36: 0x00000001009f4ea7
clang`clang::declvisitor::Base<clang::declvisitor::make_ptr,
clang::TemplateDeclInstantiator, clang::Decl*>::Visit(this=0x00007fff5f409f20,
D=0x0000000108062990) + 1191 at DeclNodes.inc:333
    frame #37: 0x0000000100a0a454
clang`clang::Sema::SubstDecl(this=0x0000000108045200, D=0x0000000108062990,
Owner=0x0000000108061d68, TemplateArgs=0x00007fff5f40a278) + 132 at
SemaTemplateInstantiateDecl.cpp:2192
    frame #38: 0x000000010097c02b
clang`clang::Sema::FinishTemplateArgumentDeduction(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, Deduced=0x00007fff5f40ae68,
NumExplicitlySpecified=0, Specialization=0x00007fff5f40b0e8,
Info=0x00007fff5f40b0f8, OriginalCallArgs=0x00007fff5f40ad90) + 2859 at
SemaTemplateDeduction.cpp:2712
    frame #39: 0x000000010097dfd9
clang`clang::Sema::DeduceTemplateArguments(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, ExplicitTemplateArgs=0x0000000000000000,
Args=(null), Specialization=0x00007fff5f40b0e8, Info=0x00007fff5f40b0f8) + 4457
at SemaTemplateDeduction.cpp:3291
    frame #40: 0x000000010089f031
clang`clang::Sema::AddTemplateOverloadCandidate(this=0x0000000108045200,
FunctionTemplate=0x0000000108062a50, FoundDecl=(null),
ExplicitTemplateArgs=0x0000000000000000, Args=(null),
CandidateSet=0x00007fff5f40bac0, SuppressUserConversions=false) + 241 at
SemaOverload.cpp:5669
    frame #41: 0x00000001008a6c24
clang`clang::Sema::AddArgumentDependentLookupCandidates(this=0x0000000108045200,
Name=(null), Operator=true, Loc=(null), Args=(null),
ExplicitTemplateArgs=0x0000000000000000, CandidateSet=0x00007fff5f40bac0,
PartialOverloading=false) + 868 at SemaOverload.cpp:7775
    frame #42: 0x00000001008aedbe
clang`clang::Sema::CreateOverloadedBinOp(this=0x0000000108045200, OpLoc=(null),
OpcIn=3, Fns=0x00007fff5f40cfd8, LHS=0x0000000000000000,
RHS=0x0000000000000000) + 2302 at SemaOverload.cpp:10306
    frame #43: 0x0000000100757ee8
clang`BuildOverloadedBinOp(S=0x0000000108045200, Sc=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHS=0x0000000108185e68, RHS=0x0000000108185e90) + 280
at SemaExpr.cpp:8737
    frame #44: 0x0000000100757d82
clang`clang::Sema::BuildBinOp(this=0x0000000108045200, S=0x0000000000000000,
OpLoc=(null), Opc=BO_Div, LHSExpr=0x0000000108185e68,
RHSExpr=0x0000000108185e90) + 1218 at SemaExpr.cpp:8811
    frame #45: 0x00000001009e5279
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0, OpLoc=(null), Opc=BO_Div,
LHS=0x0000000108185e68,
RHS=0x0000000108185e90)::TemplateInstantiator>::RebuildBinaryOperator(clang::SourceLocation,
clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) + 73 at
TreeTransform.h:1578
    frame #46: 0x00000001009d13f2
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0,
E=0x0000000108062878)::TemplateInstantiator>::TransformBinaryOperator(clang::BinaryOperator*)
+ 466 at TreeTransform.h:6534
    frame #47: 0x00000001009c6fee
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0,
E=0x0000000108062878)::TemplateInstantiator>::TransformExpr(clang::Expr*) + 510
at StmtNodes.inc:151
    frame #48: 0x00000001009ee0b9
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0, TLB=0x00007fff5f40e090,
TL=(null))::TemplateInstantiator>::TransformDecltypeType(clang::TypeLocBuilder&,
clang::DecltypeTypeLoc) + 137 at TreeTransform.h:4427
    frame #49: 0x00000001009c0601
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0, TLB=0x00007fff5f40e090,
T=(null))::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) + 2273 at TypeNodes.def:86
    frame #50: 0x00000001009f3a84
clang`clang::TreeTransform<(this=0x00007fff5f40e0e0, TLB=0x00007fff5f40e090,
TL=(null), ThisContext=0x0000000000000000,
ThisTypeQuals=0)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, unsigned int) + 468 at
TreeTransform.h:4244</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>