[AST] Unify the code paths of traversing lambda expressions.
Summary: This supposes to be a non-functional change. We have two code paths when traversing lambda expressions: 1) traverse the function proto typeloc when parameters and return type are explicit; 2) otherwise fallback to traverse parameter decls and return type loc individually; This patch unifies the code path to always traverse parameters and return type, rather than relying on traversing the full type-loc. Reviewers: ilya-biryukov Subscribers: arphaman, cfe-commits Differential Revision: https://reviews.llvm.org/D55820 llvm-svn: 349494
This commit is contained in:
parent
cfa54fb456
commit
ef87c26796
|
@ -2414,27 +2414,20 @@ DEF_TRAVERSE_STMT(LambdaExpr, {
|
|||
TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
|
||||
FunctionProtoTypeLoc Proto = TL.getAsAdjusted<FunctionProtoTypeLoc>();
|
||||
|
||||
if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
|
||||
// Visit the whole type.
|
||||
TRY_TO(TraverseTypeLoc(TL));
|
||||
} else {
|
||||
if (S->hasExplicitParameters()) {
|
||||
// Visit parameters.
|
||||
for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
|
||||
TRY_TO(TraverseDecl(Proto.getParam(I)));
|
||||
}
|
||||
} else if (S->hasExplicitResultType()) {
|
||||
TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
|
||||
}
|
||||
|
||||
auto *T = Proto.getTypePtr();
|
||||
for (const auto &E : T->exceptions()) {
|
||||
TRY_TO(TraverseType(E));
|
||||
}
|
||||
|
||||
if (Expr *NE = T->getNoexceptExpr())
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(NE);
|
||||
if (S->hasExplicitParameters()) {
|
||||
// Visit parameters.
|
||||
for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
|
||||
TRY_TO(TraverseDecl(Proto.getParam(I)));
|
||||
}
|
||||
if (S->hasExplicitResultType())
|
||||
TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
|
||||
|
||||
auto *T = Proto.getTypePtr();
|
||||
for (const auto &E : T->exceptions())
|
||||
TRY_TO(TraverseType(E));
|
||||
|
||||
if (Expr *NE = T->getNoexceptExpr())
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(NE);
|
||||
|
||||
ReturnValue = TRAVERSE_STMT_BASE(LambdaBody, LambdaExpr, S, Queue);
|
||||
ShouldVisitChildren = false;
|
||||
|
|
|
@ -14,9 +14,9 @@ struct X {
|
|||
// CHECK-LOAD: cxx11-lambdas.cpp:7:19: LambdaExpr= Extent=[7:19 - 9:6]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:21: VariableRef=localA:6:9 Extent=[7:21 - 7:27]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:29: VariableRef=localB:6:17 Extent=[7:29 - 7:35]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:52: TypeRef=Integer:3:13 Extent=[7:52 - 7:59]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:46: ParmDecl=x:7:46 (Definition) Extent=[7:38 - 7:47]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:38: TypeRef=Integer:3:13 Extent=[7:38 - 7:45]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:52: TypeRef=Integer:3:13 Extent=[7:52 - 7:59]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:7:60: CompoundStmt= Extent=[7:60 - 9:6]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:8:7: ReturnStmt= Extent=[8:7 - 8:33]
|
||||
// CHECK-LOAD: cxx11-lambdas.cpp:8:14: DeclRefExpr=localA:6:9 Extent=[8:14 - 8:20]
|
||||
|
|
|
@ -3135,25 +3135,19 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
|
|||
return true;
|
||||
}
|
||||
|
||||
TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
|
||||
// Visit parameters and return type, if present.
|
||||
if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
|
||||
TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
|
||||
if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
|
||||
// Visit the whole type.
|
||||
if (Visit(TL))
|
||||
return true;
|
||||
} else if (FunctionProtoTypeLoc Proto =
|
||||
TL.getAs<FunctionProtoTypeLoc>()) {
|
||||
if (E->hasExplicitParameters()) {
|
||||
// Visit parameters.
|
||||
for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
|
||||
if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
|
||||
return true;
|
||||
} else {
|
||||
// Visit result type.
|
||||
if (Visit(Proto.getReturnLoc()))
|
||||
if (FunctionTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
|
||||
if (E->hasExplicitParameters()) {
|
||||
// Visit parameters.
|
||||
for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
|
||||
if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (E->hasExplicitResultType()) {
|
||||
// Visit result type.
|
||||
if (Visit(Proto.getReturnLoc()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue