This revision was automatically updated to reflect the committed changes.
Closed by commit rL332307: [c++17] Fix assertion on synthesizing deduction 
guides after a fatal error. (authored by vsapsai, committed by ).
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D46446?vs=145251&id=146713#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D46446

Files:
  cfe/trunk/lib/Sema/SemaTemplate.cpp
  cfe/trunk/test/SemaTemplate/instantiate-after-fatal-cxx17.cpp


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<class T> struct A {
+    template <class U> A(T&, ...);
+  };
+  // Deduction guide triggers constructor instantiation.
+  template<class T> A(const T&, const T&) -> A<T&>;
+
+}
+


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<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
  • [PATCH] D46446: [... Volodymyr Sapsai via Phabricator via cfe-commits
    • [PATCH] D464... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D464... Volodymyr Sapsai via Phabricator via cfe-commits
    • [PATCH] D464... Volodymyr Sapsai via Phabricator via cfe-commits

Reply via email to