Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -17057,11 +17057,12 @@ PointOfInstantiation = Loc; } + const bool isLocalClass = + isa(Func->getDeclContext()) && + cast(Func->getDeclContext())->isLocalClass(); if (FirstInstantiation || TSK != TSK_ImplicitInstantiation || - Func->isConstexpr()) { - if (isa(Func->getDeclContext()) && - cast(Func->getDeclContext())->isLocalClass() && - CodeSynthesisContexts.size()) + (!isLocalClass && Func->isConstexpr())) { + if (isLocalClass && CodeSynthesisContexts.size()) PendingLocalImplicitInstantiations.push_back( std::make_pair(Func, PointOfInstantiation)); else if (Func->isConstexpr()) Index: clang/test/SemaTemplate/instantiate-local-class.cpp =================================================================== --- clang/test/SemaTemplate/instantiate-local-class.cpp +++ clang/test/SemaTemplate/instantiate-local-class.cpp @@ -504,3 +504,24 @@ } template void f(); } + +namespace PR48839 { +template +void construct() { + T(0); +} + +template +void tester() { + struct d { + void test() { + construct(); + } + constexpr d(T b) : a(b) {} + + T a; + }; +} + +void g() { tester(); } +} // namespace PR48839