diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4853,6 +4853,10 @@ if (getLangOpts().CPlusPlus11) Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Function; + } else if (!Recursive) { + Function->setInstantiationIsPending(true); + PendingInstantiations.push_back( + std::make_pair(Function, PointOfInstantiation)); } } diff --git a/clang/test/SemaCXX/constexpr-late-instantiation.cpp b/clang/test/SemaCXX/constexpr-late-instantiation.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/constexpr-late-instantiation.cpp @@ -0,0 +1,17 @@ +// Make sure foo is sinstantiated and we don't get a link error +// RUN: %clang_cc1 -S -emit-llvm %s -o- | FileCheck %s + +template +constexpr T foo(T a); + +// CHECK-LABEL: define {{.*}} @main +int main() { + // CHECK: call {{.*}} @_Z3fooIiET_S0_ + int k = foo(5); +} + +// CHECK-LABEL: define {{.*}} @_Z3fooIiET_S0_ +template +constexpr T foo(T a) { + return a; +}