mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 02:46:06 +00:00

For constexpr function templates, we immediately instantiate them upon reference. However, if the function isn't defined at the time of instantiation, even though it might be defined later, the instantiation would forever fail. This patch corrects the behavior by popping up failed instantiations through PendingInstantiations, so that we are able to instantiate them again in the future (e.g. at the end of TU.) Fixes https://github.com/llvm/llvm-project/issues/125747
63 lines
1.3 KiB
C++
63 lines
1.3 KiB
C++
// RUN: %clang_cc1 -emit-llvm -Wundefined-func-template -verify -triple %itanium_abi_triple %s -o - | FileCheck %s
|
|
// expected-no-diagnostics
|
|
|
|
// CHECK-DAG: _ZZN7PR219047GetDataIiEERKibE1i = internal global i32 4
|
|
// CHECK-DAG: _ZZN7PR219047GetDataIiEERKibE1i_0 = internal global i32 2
|
|
|
|
template<typename T, typename U>
|
|
T* next(T* ptr, const U& diff);
|
|
|
|
template<typename T, typename U>
|
|
T* next(T* ptr, const U& diff) {
|
|
return ptr + diff;
|
|
}
|
|
|
|
void test(int *iptr, float *fptr, int diff) {
|
|
// CHECK: _Z4nextIiiEPT_S1_RKT0_
|
|
iptr = next(iptr, diff);
|
|
|
|
// CHECK: _Z4nextIfiEPT_S1_RKT0_
|
|
fptr = next(fptr, diff);
|
|
}
|
|
|
|
template<typename T, typename U>
|
|
T* next(T* ptr, const U& diff);
|
|
|
|
void test2(int *iptr, double *dptr, int diff) {
|
|
iptr = next(iptr, diff);
|
|
|
|
// CHECK: _Z4nextIdiEPT_S1_RKT0_
|
|
dptr = next(dptr, diff);
|
|
}
|
|
|
|
namespace PR21904 {
|
|
template <typename>
|
|
const int &GetData(bool);
|
|
|
|
template <>
|
|
const int &GetData<int>(bool b) {
|
|
static int i = 4;
|
|
if (b) {
|
|
static int i = 2;
|
|
return i;
|
|
}
|
|
return i;
|
|
}
|
|
}
|
|
|
|
namespace GH125747 {
|
|
|
|
template<typename F> constexpr int visit(F f) { return f(0); }
|
|
|
|
template <class T> int G(T t);
|
|
|
|
int main() { return visit([](auto s) -> int { return G(s); }); }
|
|
|
|
template <class T> int G(T t) {
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: define {{.*}} @_ZN8GH1257471GIiEEiT_
|
|
|
|
}
|