[clang] [clang] Track final substitution for Subst* AST nodes (PR #132748)
Pranav Kant via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 9 14:14:10 PDT 2025
pranavk wrote:
This causes another mangling issue similar to [this](https://github.com/llvm/llvm-project/pull/133610#issuecomment-2787332042).
Here's the repro:
```
namespace {
template <int> struct enable_if {
typedef int type;
};
template <bool _Bp, class> using enable_if_t = enable_if<_Bp>::type;
template <int __v> struct integral_constant {
static const int value = __v;
};
template <bool _Val> using _BoolConstant = integral_constant<_Val>;
template <class _Tp, class _Up>
using _IsNotSame = _BoolConstant<__is_same(_Tp, _Up)>;
template <class...> using __expand_to_true = integral_constant<true>;
template <class...> __expand_to_true<> __and_helper(int);
template <class... _Pred> using _And = decltype(__and_helper<_Pred...>(0));
template <int> struct _OrImpl {
template <class, class _First, class> using _Result = _OrImpl<_First::value>;
};
template <class... _Args>
using _Or =
_OrImpl<sizeof...(_Args)>::template _Result<integral_constant<false>,
_Args...>;
struct optional {
template <class _Up, enable_if_t<_And<_IsNotSame<_Up, optional>,
_Or<_IsNotSame<_Up, int>, int>>::value,
int> = 0>
void operator=(_Up);
};
} // namespace
optional f_opt;
void f() { f_opt = int{}; }
```
`clang -c -std=gnu++20 -x c++ /tmp/reduced.i`
`llvm-readelf -s -W reduced.o | grep -P 'optional.*aS.*srNS[0-9]_I'`
The subexpression srNS5_I...E violates the grammar at https://itanium-cxx-abi.github.io/cxx-abi/abi.html#expressions. The srN must be followed by an <unresolved-type>, which is allowed to be a <substitution> such as S5_, but not a substitution followed by I...E template arguments. LLVM, GNU, and Abseil demanglers correctly reject this name.
https://github.com/llvm/llvm-project/pull/132748
More information about the cfe-commits
mailing list