Author: vsapsai Date: Mon May 14 15:49:44 2018 New Revision: 332307 URL: http://llvm.org/viewvc/llvm-project?rev=332307&view=rev Log: [c++17] Fix assertion on synthesizing deduction guides after a fatal error.
After a fatal error Sema::InstantiatingTemplate doesn't allow further instantiation and doesn't push a CodeSynthesisContext. When we tried to synthesize implicit deduction guides from constructors we hit the assertion > Assertion failed: (!CodeSynthesisContexts.empty() && "Cannot perform an > instantiation without some context on the " "instantiation stack"), function > SubstType, file clang/lib/Sema/SemaTemplateInstantiate.cpp, line 1580. Fix by avoiding deduction guide synthesis if InstantiatingTemplate is invalid. rdar://problem/39051732 Reviewers: rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D46446 Added: cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=332307&r1=332306&r2=332307&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon May 14 15:49:44 2018 @@ -1976,6 +1976,8 @@ void Sema::DeclareImplicitDeductionGuide // 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 Added: cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp?rev=332307&view=auto ============================================================================== --- cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp (added) +++ cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp Mon May 14 15:49:44 2018 @@ -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<class T> struct A { + template <class U> A(T&, ...); + }; + // Deduction guide triggers constructor instantiation. + template<class T> A(const T&, const T&) -> A<T&>; + +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits