This fixes a regression introduced in #161029, though not the fault of that patch, only by incidental changes regarding the preservation of constant expression nodes. The LValue emission of ConstantExpr was doing strange things with regards to what type corresponds to the result of the constant expression, which are not justified by any tests or in the discussions of the relevant patches. See09669e6c5fand https://github.com/llvm/llvm-project/pull/78041 and51e4aa87e0This simplifies it to just use the expression type. Since this regression was never released, there are no release notes. Fixes #177807
36 lines
1008 B
C++
36 lines
1008 B
C++
// RUN: %clang_cc1 %s -O0 -disable-llvm-passes -triple=x86_64 -std=c++20 -emit-llvm -o - | FileCheck %s
|
|
|
|
namespace GH161029_regression1 {
|
|
template <class _Fp> auto f(int) { _Fp{}(0); }
|
|
template <class _Fp, int... _Js> void g() {
|
|
(..., f<_Fp>(_Js));
|
|
}
|
|
enum E { k };
|
|
template <int, E> struct ElementAt;
|
|
template <E First> struct ElementAt<0, First> {
|
|
static int value;
|
|
};
|
|
template <typename T, T Item> struct TagSet {
|
|
template <int Index> using Tag = ElementAt<Index, Item>;
|
|
};
|
|
template <typename TagSet> struct S {
|
|
void U() { (void)TagSet::template Tag<0>::value; }
|
|
};
|
|
S<TagSet<E, k>> s;
|
|
void h() {
|
|
g<decltype([](auto) -> void { s.U(); }), 0>();
|
|
}
|
|
// CHECK-DAG: call void @_ZN20GH161029_regression11SINS_6TagSetINS_1EELS2_0EEEE1UEv
|
|
}
|
|
|
|
namespace GH177807 {
|
|
template<int &G> void foo() {
|
|
[](auto ...A) {
|
|
(((void)A, G), ...) = 1234;
|
|
}(0);
|
|
}
|
|
int i = 0;
|
|
template void foo<i>();
|
|
// CHECK-DAG: store i32 1234, ptr @_ZN8GH1778071iE, align 4
|
|
}
|