Fix bug which sometimes resulted in further diagnostics being produced after a

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.

llvm-svn: 164437
This commit is contained in:
Richard Smith 2012-09-22 00:53:56 +00:00
parent 493dffe2b1
commit 6d12af7410
5 changed files with 20 additions and 21 deletions

View 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;
}

View 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'}}

View File

@ -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}}
}

View 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;

View 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{});