diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-09-22 00:53:56 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-09-22 00:53:56 +0000 |
commit | 5d99a252c63a7745bcd71231ca5240d2a65e4f1d (patch) | |
tree | d269bdf7cf546130a033bb63d388179378996606 | |
parent | 3d442196134d18ed8ee17576638b758362b60742 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164437 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/Diagnostic.h | 5 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-exception-spec-cxx11.cpp | 12 | ||||
-rw-r--r-- | test/SemaTemplate/instantiation-depth-exception-spec.cpp | 11 | ||||
-rw-r--r-- | test/SemaTemplate/instantiation-depth-subst-2.cpp | 7 | ||||
-rw-r--r-- | test/SemaTemplate/instantiation-depth-subst.cpp | 6 |
5 files changed, 20 insertions, 21 deletions
diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index b7cfa38685..b596937061 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -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; } diff --git a/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp b/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp index c560c6ba2a..97bf00303b 100644 --- a/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp +++ b/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp @@ -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 index 0000000000..6caa4a60e6 --- /dev/null +++ b/test/SemaTemplate/instantiation-depth-exception-spec.cpp @@ -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}} +} diff --git a/test/SemaTemplate/instantiation-depth-subst-2.cpp b/test/SemaTemplate/instantiation-depth-subst-2.cpp index a29d6b5a1b..ef2a5c765d 100644 --- a/test/SemaTemplate/instantiation-depth-subst-2.cpp +++ b/test/SemaTemplate/instantiation-depth-subst-2.cpp @@ -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; diff --git a/test/SemaTemplate/instantiation-depth-subst.cpp b/test/SemaTemplate/instantiation-depth-subst.cpp index 58e637411c..06795f9514 100644 --- a/test/SemaTemplate/instantiation-depth-subst.cpp +++ b/test/SemaTemplate/instantiation-depth-subst.cpp @@ -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{}); |