]> granicus.if.org Git - clang/commitdiff
Fix bug which sometimes resulted in further diagnostics being produced after a
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 22 Sep 2012 00:53:56 +0000 (00:53 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 22 Sep 2012 00:53:56 +0000 (00:53 +0000)
fatal error. Previously, if a fatal error was followed by a diagnostic which
was suppressed due to a SFINAETrap, we'd forget that we'd seen a fatal error.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164437 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Diagnostic.h
test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
test/SemaTemplate/instantiation-depth-exception-spec.cpp [new file with mode: 0644]
test/SemaTemplate/instantiation-depth-subst-2.cpp
test/SemaTemplate/instantiation-depth-subst.cpp

index b7cfa38685b3e78e30366b05866f338e57a8234c..b596937061e1ae39030701160df6f5d8bfc7a4aa 100644 (file)
@@ -478,10 +478,13 @@ public:
   }
   OverloadsShown getShowOverloads() const { return ShowOverloads; }
   
-  /// \brief Pretend that the last diagnostic issued was ignored.
+  /// \brief Pretend that the last diagnostic issued was ignored, so any
+  /// subsequent notes will be suppressed.
   ///
   /// This can be used by clients who suppress diagnostics themselves.
   void setLastDiagnosticIgnored() {
+    if (LastDiagLevel == DiagnosticIDs::Fatal)
+      FatalErrorOccurred = true;
     LastDiagLevel = DiagnosticIDs::Ignored;
   }
   
index c560c6ba2a3b4d52e3c62186cecb4596a5d839b3..97bf00303bbe938c247a25bdda9d526068300d27 100644 (file)
@@ -34,18 +34,6 @@ template<> struct S<10> {};
 void (*pFn2)() noexcept = &S<0>::recurse; // expected-note {{instantiation of exception spec}} expected-error {{not superset}}
 
 
-template<typename T> T go(T a) noexcept(noexcept(go(a))); // \
-// expected-error 16{{call to function 'go' that is neither visible}} \
-// expected-note 16{{'go' should be declared prior to the call site}} \
-// expected-error {{recursive template instantiation exceeded maximum depth of 16}} \
-// expected-error {{use of undeclared identifier 'go'}} \
-
-void f() {
-  int k = go(0); // \
-  // expected-note {{in instantiation of exception specification for 'go<int>' requested here}}
-}
-
-
 namespace dr1330_example {
   template <class T> struct A {
     void f(...) throw (typename T::X); // expected-error {{'int'}}
diff --git a/test/SemaTemplate/instantiation-depth-exception-spec.cpp b/test/SemaTemplate/instantiation-depth-exception-spec.cpp
new file mode 100644 (file)
index 0000000..6caa4a6
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -ftemplate-depth 16 -fcxx-exceptions -fexceptions %s
+
+template<typename T> T go(T a) noexcept(noexcept(go(a))); // \
+// expected-error 16{{call to function 'go' that is neither visible}} \
+// expected-note 16{{'go' should be declared prior to the call site}} \
+// expected-error {{recursive template instantiation exceeded maximum depth of 16}}
+
+void f() {
+  int k = go(0); // \
+  // expected-note {{in instantiation of exception specification for 'go<int>' requested here}}
+}
index a29d6b5a1b4c3e86e7011fcd0138f4d71f4194f1..ef2a5c765d9cc55d6e80e8493bb3b8d525757be7 100644 (file)
@@ -1,9 +1,6 @@
 // RUN: %clang_cc1 -verify %s -ftemplate-depth 2
 
 template<int N> struct S { };
-// FIXME: We produce the same 'instantiation depth' error here many times
-// (2^(depth+1) in total), due to additional lookups performed as part of
-// error recovery in DiagnoseTwoPhaseOperatorLookup.
-template<typename T> S<T() + T()> operator+(T, T); // expected-error 8{{}} expected-note 10{{}}
+template<typename T> S<T() + T()> operator+(T, T); // expected-error {{instantiation exceeded maximum depth}} expected-note 3{{while substituting}}
 S<0> s;
-int k = s + s; // expected-error {{invalid operands to binary expression}}
+int k = s + s;
index 58e637411c66c6c52b44c1a7f25960c6c0db4dbf..06795f9514d38f5e00e9f2e057ea6664edaf8a5a 100644 (file)
@@ -3,7 +3,7 @@
 // PR9793
 template<typename T> auto f(T t) -> decltype(f(t)); // \
 // expected-error {{recursive template instantiation exceeded maximum depth of 2}} \
-// expected-note 3 {{while substituting}} \
-// expected-note {{candidate}}
+// expected-note 3 {{while substituting}}
 
-int k = f(0); // expected-error {{no matching function for call to 'f'}}
+struct S {};
+int k = f(S{});