Index: cfe/trunk/lib/Sema/SemaTemplate.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp +++ cfe/trunk/lib/Sema/SemaTemplate.cpp @@ -1976,6 +1976,8 @@ // FIXME: Add a kind for this to give more meaningful diagnostics. But can // this substitution process actually fail? InstantiatingTemplate BuildingDeductionGuides(*this, Loc, Template); + if (BuildingDeductionGuides.isInvalid()) + return; // Convert declared constructors into deduction guide templates. // FIXME: Skip constructors for which deduction must necessarily fail (those Index: cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp =================================================================== --- cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp +++ cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp @@ -0,0 +1,16 @@ +// RUN: not %clang_cc1 -std=c++17 -fsyntax-only -ferror-limit 1 %s 2>&1 | FileCheck %s + +#error Error 1 +#error Error 2 +// CHECK: fatal error: too many errors emitted, stopping now + +namespace rdar39051732 { + + template struct A { + template A(T&, ...); + }; + // Deduction guide triggers constructor instantiation. + template A(const T&, const T&) -> A; + +} +