diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index d14376ac8473b4..a3693b524f96c5 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -2568,6 +2568,7 @@ template struct AbstractManglingParser { Call, // Function call: expr (expr*) CCast, // C cast: (type)expr Conditional, // Conditional: expr ? expr : expr + NameOnly, // Overload only, not allowed in expression. // Below do not have operator names NamedCast, // Named cast, @(expr) OfIdOp, // alignof, sizeof, typeid @@ -2877,6 +2878,7 @@ AbstractManglingParser::parseOperatorEncoding() { {"ad", OperatorInfo::Prefix, false, "operator&"}, {"an", OperatorInfo::Binary, false, "operator&"}, {"at", OperatorInfo::OfIdOp, /*Type*/ true, "alignof ("}, + {"aw", OperatorInfo::NameOnly, false, "operator co_await"}, {"az", OperatorInfo::OfIdOp, /*Type*/ false, "alignof ("}, {"cc", OperatorInfo::NamedCast, false, "const_cast"}, {"cl", OperatorInfo::Call, false, "operator()"}, @@ -4573,6 +4575,10 @@ Node *AbstractManglingParser::parseExpr() { return nullptr; return make(Sym, Arg, ")"); } + case OperatorInfo::NameOnly: { + // Not valid as an expression operand. + return nullptr; + } } DEMANGLE_UNREACHABLE; } diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 2f438143fbf162..9ad692973a00f7 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29865,6 +29865,8 @@ const char* cases[][2] = {"_ZN2FnIXdlLj4EEXgsdaLj4EEEEvv", "void Fn()"}, {"_Z3TPLIiET_S0_", "int TPL(int)"}, + + {"_ZN1XawEv", "X::operator co_await()"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); @@ -29950,6 +29952,8 @@ const char* invalid_cases[] = "_ZN1fIiEEvNTUt_E", "_ZNDTUt_Ev", + + "_ZN1fIXawLi0EEEEvv", }; const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index cf0bd6d180c959..ad5c7da544656e 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -2568,6 +2568,7 @@ template struct AbstractManglingParser { Call, // Function call: expr (expr*) CCast, // C cast: (type)expr Conditional, // Conditional: expr ? expr : expr + NameOnly, // Overload only, not allowed in expression. // Below do not have operator names NamedCast, // Named cast, @(expr) OfIdOp, // alignof, sizeof, typeid @@ -2877,6 +2878,7 @@ AbstractManglingParser::parseOperatorEncoding() { {"ad", OperatorInfo::Prefix, false, "operator&"}, {"an", OperatorInfo::Binary, false, "operator&"}, {"at", OperatorInfo::OfIdOp, /*Type*/ true, "alignof ("}, + {"aw", OperatorInfo::NameOnly, false, "operator co_await"}, {"az", OperatorInfo::OfIdOp, /*Type*/ false, "alignof ("}, {"cc", OperatorInfo::NamedCast, false, "const_cast"}, {"cl", OperatorInfo::Call, false, "operator()"}, @@ -4573,6 +4575,10 @@ Node *AbstractManglingParser::parseExpr() { return nullptr; return make(Sym, Arg, ")"); } + case OperatorInfo::NameOnly: { + // Not valid as an expression operand. + return nullptr; + } } DEMANGLE_UNREACHABLE; }