r332307 - [c++17] Fix assertion on synthesizing deduction guides after a fatal error.
Volodymyr Sapsai via cfe-commits
cfe-commits at lists.llvm.org
Mon May 14 15:49:45 PDT 2018
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&>;
+
+}
+
More information about the cfe-commits
mailing list