forked from OSchip/llvm-project
[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 llvm-svn: 332307
This commit is contained in:
parent
3876d89a1b
commit
2f649f3d7f
|
@ -1976,6 +1976,8 @@ void Sema::DeclareImplicitDeductionGuides(TemplateDecl *Template,
|
|||
// 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
|
||||
|
|
|
@ -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&>;
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue