|
4 | 4 | #include "converter/mapper.h" |
5 | 5 |
|
6 | 6 | #include <clang/AST/ExprCXX.h> |
| 7 | +#include <clang/Basic/OperatorKinds.h> |
7 | 8 | #include <clang/Basic/SourceManager.h> |
8 | 9 | #include <clang/Lex/Lexer.h> |
9 | 10 | #include <llvm/Support/ThreadPool.h> |
@@ -922,8 +923,30 @@ std::string ToString(const clang::NamedDecl *decl) { |
922 | 923 | } |
923 | 924 |
|
924 | 925 | os << ToString(func_decl->getReturnType()) << ' '; |
925 | | - if (const auto *method_decl = |
926 | | - llvm::dyn_cast<clang::CXXMethodDecl>(func_decl)) { |
| 926 | + if (const auto op = func_decl->getOverloadedOperator(); |
| 927 | + op >= clang::OverloadedOperatorKind::OO_LessLess && |
| 928 | + op <= clang::OverloadedOperatorKind::OO_GreaterGreaterEqual) { |
| 929 | + // ensure matchTemplate does not consider these operator names when matching |
| 930 | + func_decl->getQualifier().print(os, getPrintPolicy()); |
| 931 | + os << "operator "; |
| 932 | + switch (op) { |
| 933 | + case clang::OverloadedOperatorKind::OO_LessLess: |
| 934 | + os << "shl"; |
| 935 | + break; |
| 936 | + case clang::OverloadedOperatorKind::OO_GreaterGreater: |
| 937 | + os << "shr"; |
| 938 | + break; |
| 939 | + case clang::OverloadedOperatorKind::OO_LessLessEqual: |
| 940 | + os << "shleq"; |
| 941 | + break; |
| 942 | + case clang::OverloadedOperatorKind::OO_GreaterGreaterEqual: |
| 943 | + os << "shreq"; |
| 944 | + break; |
| 945 | + default: |
| 946 | + std::unreachable(); |
| 947 | + } |
| 948 | + } else if (const auto *method_decl = |
| 949 | + llvm::dyn_cast<clang::CXXMethodDecl>(func_decl)) { |
927 | 950 | if (method_decl->getParent()->isLambda() && |
928 | 951 | method_decl->getOverloadedOperator() == clang::OO_Call) { |
929 | 952 | func_decl->printName(os, getPrintPolicy()); |
|
0 commit comments