
Previously, we were emitting an extraneous X .. E in <template-arg> around an <expr-primary> if the template argument was constructed from an expression (rather than an already-evaluated literal value). In such a case, we would then e.g. emit 'XLi0EE' instead of 'Li0E'. We had one special-case for DeclRefExpr expressions, in particular, to omit them the mangled-name without the surrounding X/E. However, unfortunately, that special case also triggered for ParmVarDecl (a subtype of VarDecl), and _incorrectly_ emitted 'L_Z .. E' instead of the proper 'Xfp_E'. This change causes mangleExpression itself to be responsible for emitting X/E around non-primary expressions, which removes the special-case, and corrects both these problems. Differential Revision: https://reviews.llvm.org/D95487
17 lines
578 B
C++
17 lines
578 B
C++
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++2a -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
|
|
// expected-no-diagnostics
|
|
|
|
namespace test1 {
|
|
template <bool> struct S {};
|
|
template <typename> concept C = true;
|
|
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
|
|
template S<C<int>> f0<>();
|
|
// CHECK: @_ZN5test12f0IiEENS_1SIL_ZNS_1CIT_EEEEEv(
|
|
}
|
|
|
|
template <bool> struct S {};
|
|
template <typename> concept C = true;
|
|
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
|
|
template S<C<int>> f0<>();
|
|
// CHECK: @_Z2f0IiE1SIL_Z1CIT_EEEv(
|