diff options
author | James Y Knight <jyknight@google.com> | 2021-01-24 16:23:58 -0500 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2021-01-27 16:46:52 -0500 |
commit | a7246ba02a8923f316419a62d836dbe1c0b437bd (patch) | |
tree | bf2e252c19012139af87400559f11a140b6630f1 /clang/lib | |
parent | 8ca33605ff0cfc536f5c6710fb5f6378bf11959a (diff) | |
download | llvm-a7246ba02a8923f316419a62d836dbe1c0b437bd.zip llvm-a7246ba02a8923f316419a62d836dbe1c0b437bd.tar.gz llvm-a7246ba02a8923f316419a62d836dbe1c0b437bd.tar.bz2 |
Itanium Mangling: In 'enable_if', omit X/E around <expr-primary>.
The Clang enable_if extension is mangled as an <extended-qualifier>,
which is supposed to contain <template-args>. However, we were
unconditionally emitting X/E around its arguments, neglecting the fact
that <expr-primary> should be emitted directly without the surrounding
X/E.
Differential Revision: https://reviews.llvm.org/D95488
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 54e2f36..4420f6a 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -727,9 +727,17 @@ void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) { EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I); if (!EIA) continue; - Out << 'X'; - mangleExpression(EIA->getCond()); - Out << 'E'; + if (Context.getASTContext().getLangOpts().getClangABICompat() > + LangOptions::ClangABI::Ver11) { + mangleTemplateArgExpr(EIA->getCond()); + } else { + // Prior to Clang 12, we hardcoded the X/E around enable-if's argument, + // even though <template-arg> should not include an X/E around + // <expr-primary>. + Out << 'X'; + mangleExpression(EIA->getCond()); + Out << 'E'; + } } Out << 'E'; FunctionTypeDepth.pop(Saved); |