Files
llvm-project/clang/test/CodeGenCXX/template-cxx20.cpp
Matheus Izvekov a3b51529d1 [clang] CodeGen: fix ConstantExpr LValue emission (#181057)
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.

See

09669e6c5f
and https://github.com/llvm/llvm-project/pull/78041 and
51e4aa87e0

This simplifies it to just use the expression type.

Since this regression was never released, there are no release notes.

Fixes #177807
2026-02-12 22:07:48 -03:00

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
}