1d488daa0SDavid Zarzycki //===- unittest/Tooling/RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp -===//
2d488daa0SDavid Zarzycki //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d488daa0SDavid Zarzycki //
7d488daa0SDavid Zarzycki //===----------------------------------------------------------------------===//
8d488daa0SDavid Zarzycki 
9d488daa0SDavid Zarzycki #include "TestVisitor.h"
10d488daa0SDavid Zarzycki 
11d488daa0SDavid Zarzycki using namespace clang;
12d488daa0SDavid Zarzycki 
13d488daa0SDavid Zarzycki namespace {
14d488daa0SDavid Zarzycki 
15d488daa0SDavid Zarzycki class CXXOperatorCallExprTraverser
16d488daa0SDavid Zarzycki   : public ExpectedLocationVisitor<CXXOperatorCallExprTraverser> {
17d488daa0SDavid Zarzycki public:
18d488daa0SDavid Zarzycki   // Use Traverse, not Visit, to check that data recursion optimization isn't
19d488daa0SDavid Zarzycki   // bypassing the call of this function.
TraverseCXXOperatorCallExpr(CXXOperatorCallExpr * CE)20d488daa0SDavid Zarzycki   bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *CE) {
21d488daa0SDavid Zarzycki     Match(getOperatorSpelling(CE->getOperator()), CE->getExprLoc());
22d488daa0SDavid Zarzycki     return ExpectedLocationVisitor<CXXOperatorCallExprTraverser>::
23d488daa0SDavid Zarzycki         TraverseCXXOperatorCallExpr(CE);
24d488daa0SDavid Zarzycki   }
25d488daa0SDavid Zarzycki };
26d488daa0SDavid Zarzycki 
TEST(RecursiveASTVisitor,TraversesOverloadedOperator)27d488daa0SDavid Zarzycki TEST(RecursiveASTVisitor, TraversesOverloadedOperator) {
28d488daa0SDavid Zarzycki   CXXOperatorCallExprTraverser Visitor;
29d488daa0SDavid Zarzycki   Visitor.ExpectMatch("()", 4, 9);
30d488daa0SDavid Zarzycki   EXPECT_TRUE(Visitor.runOver(
31d488daa0SDavid Zarzycki     "struct A {\n"
32d488daa0SDavid Zarzycki     "  int operator()();\n"
33d488daa0SDavid Zarzycki     "} a;\n"
34d488daa0SDavid Zarzycki     "int k = a();\n"));
35d488daa0SDavid Zarzycki }
36d488daa0SDavid Zarzycki 
37d488daa0SDavid Zarzycki } // end anonymous namespace
38