Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4856,6 +4856,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)); } } Index: clang/test/SemaCXX/constexpr-late-instantiation.cpp =================================================================== --- /dev/null +++ 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; +}