ahatanak created this revision. ahatanak added reviewers: rsmith, majnemer. ahatanak added a subscriber: cfe-commits.
This patch makes AnalysisBasedWarnings::IssueWarnings return without issuing warnings based on CFG analysis when a fatal error has occurred. This is needed to avoid a crash that occurs when compiling the test case (instantiate-template-fatal-error.cpp). My first patch made changes in InstantiatingTemplate::InstantiatingTemplate to call hasUncompilableErrorOccurred instead of hasFatalErrorOccurred at SemaTemplateInstantiate.cpp:214. That fixed the crash for the test case but introduced a large number of regression test failures, so I fixed AnalysisBasedWarnings::IssueWarnings instead. https://reviews.llvm.org/D26166 Files: lib/Sema/AnalysisBasedWarnings.cpp test/SemaCXX/instantiate-template-fatal-error.cpp Index: test/SemaCXX/instantiate-template-fatal-error.cpp =================================================================== --- /dev/null +++ test/SemaCXX/instantiate-template-fatal-error.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s + +#pragma clang diagnostic fatal "-Wall" +#pragma clang diagnostic fatal "-Wold-style-cast" + +template <class T> bool operator==(const long long *a, T* b) { + return a == (const long long*)b; // expected-error {{use of old-style cast}} +} + +template<class T> +struct S1 { +}; + +template<class T> +struct S2 : S1<T> { + bool m1(const long long *a, T *b) const { return a == b; } +}; + +bool foo1(const long long *a, int *b) { + S2<int> s2; + return s2.m1(a, b); +} Index: lib/Sema/AnalysisBasedWarnings.cpp =================================================================== --- lib/Sema/AnalysisBasedWarnings.cpp +++ lib/Sema/AnalysisBasedWarnings.cpp @@ -1914,7 +1914,7 @@ if (cast<DeclContext>(D)->isDependentContext()) return; - if (Diags.hasUncompilableErrorOccurred()) { + if (Diags.hasUncompilableErrorOccurred() || Diags.hasFatalErrorOccurred()) { // Flush out any possibly unreachable diagnostics. flushDiagnostics(S, fscope); return;
Index: test/SemaCXX/instantiate-template-fatal-error.cpp =================================================================== --- /dev/null +++ test/SemaCXX/instantiate-template-fatal-error.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s + +#pragma clang diagnostic fatal "-Wall" +#pragma clang diagnostic fatal "-Wold-style-cast" + +template <class T> bool operator==(const long long *a, T* b) { + return a == (const long long*)b; // expected-error {{use of old-style cast}} +} + +template<class T> +struct S1 { +}; + +template<class T> +struct S2 : S1<T> { + bool m1(const long long *a, T *b) const { return a == b; } +}; + +bool foo1(const long long *a, int *b) { + S2<int> s2; + return s2.m1(a, b); +} Index: lib/Sema/AnalysisBasedWarnings.cpp =================================================================== --- lib/Sema/AnalysisBasedWarnings.cpp +++ lib/Sema/AnalysisBasedWarnings.cpp @@ -1914,7 +1914,7 @@ if (cast<DeclContext>(D)->isDependentContext()) return; - if (Diags.hasUncompilableErrorOccurred()) { + if (Diags.hasUncompilableErrorOccurred() || Diags.hasFatalErrorOccurred()) { // Flush out any possibly unreachable diagnostics. flushDiagnostics(S, fscope); return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits