diff options
-rw-r--r-- | lib/Sema/AnalysisBasedWarnings.cpp | 9 | ||||
-rw-r--r-- | test/SemaCXX/array-bounds.cpp | 10 | ||||
-rw-r--r-- | test/SemaCXX/warn-unreachable.cpp | 19 |
3 files changed, 29 insertions, 9 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index e2d1e8c331..5f1d8cc7b0 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -782,8 +782,7 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, return; // For code in dependent contexts, we'll do this at instantiation time. - if (cast<DeclContext>(D)->isDependentContext()) - return; + bool Dependent = cast<DeclContext>(D)->isDependentContext(); if (Diags.hasErrorOccurred() || Diags.hasFatalErrorOccurred()) { // Flush out any possibly unreachable diagnostics. @@ -826,7 +825,7 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, // Construct the analysis context with the specified CFG build options. // Emit delayed diagnostics. - if (!fscope->PossiblyUnreachableDiags.empty()) { + if (!fscope->PossiblyUnreachableDiags.empty() && !Dependent) { bool analyzed = false; // Register the expressions with the CFGBuilder. @@ -874,7 +873,7 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, // Warning: check missing 'return' - if (P.enableCheckFallThrough) { + if (P.enableCheckFallThrough && !Dependent) { const CheckFallThroughDiagnostics &CD = (isa<BlockDecl>(D) ? CheckFallThroughDiagnostics::MakeForBlock() : CheckFallThroughDiagnostics::MakeForFunction(D)); @@ -895,7 +894,7 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P, } // Check for thread safety violations - if (P.enableThreadSafetyAnalysis) { + if (P.enableThreadSafetyAnalysis && !Dependent) { SourceLocation FL = AC.getDecl()->getLocation(); thread_safety::ThreadSafetyReporter Reporter(S, FL); thread_safety::runThreadSafetyAnalysis(AC, Reporter); diff --git a/test/SemaCXX/array-bounds.cpp b/test/SemaCXX/array-bounds.cpp index c1b3701172..8d0b1e4e30 100644 --- a/test/SemaCXX/array-bounds.cpp +++ b/test/SemaCXX/array-bounds.cpp @@ -73,17 +73,21 @@ void test() { (*array_ptr)[3] = 1; // expected-warning {{array index 3 is past the end of the array (which contains 2 elements)}} } +// FIXME: we should see the next note only 3 times and the following warning once, not twice +// since it is independent of the template parameter 'I'. template <int I> struct S { - char arr[I]; // expected-note 2 {{declared here}} + char arr[I]; // expected-note 4 {{declared here}} }; template <int I> void f() { S<3> s; - s.arr[4] = 0; // expected-warning {{array index 4 is past the end of the array (which contains 3 elements)}} - s.arr[I] = 0; // expected-warning {{array index 5 is past the end of the array (which contains 3 elements)}} + s.arr[4] = 0; // expected-warning 2 {{array index 4 is past the end of the array (which contains 3 elements)}} + s.arr[I] = 0; // expected-warning {{array index 5 is past the end of the array (which contains 3 elements)}} \ + expected-warning {{array index 3 is past the end of the array (which contains 3 elements)}} } void test_templates() { f<5>(); // expected-note {{in instantiation}} + f<3>(); // expected-note {{in instantiation}} } #define SIZE 10 diff --git a/test/SemaCXX/warn-unreachable.cpp b/test/SemaCXX/warn-unreachable.cpp index f36300af4d..3d368759d7 100644 --- a/test/SemaCXX/warn-unreachable.cpp +++ b/test/SemaCXX/warn-unreachable.cpp @@ -98,6 +98,24 @@ void test_unreachable_templates_harness() { test_unreachable_templates<TestUnreachableB>(); } +// Do warn about non-dependent unreachable code in templates +// Warn even if the template is never instantiated + +template<typename T> void test_non_dependent_unreachable_templates() { + TestUnreachableA::foo(); + isUnreachable(); // expected-warning {{will never be executed}} +} + +// Warn only once even if the template is instantiated multiple times + +template<typename T> void test_non_dependent_unreachable_templates2() { + TestUnreachableA::foo(); + isUnreachable(); // expected-warning {{will never be executed}} +} + +template void test_non_dependent_unreachable_templates2<int>(); +template void test_non_dependent_unreachable_templates2<long>(); + // Do warn about explict template specializations, as they represent // actual concrete functions that somebody wrote. @@ -106,4 +124,3 @@ template <> void funcToSpecialize<int>() { halt(); dead(); // expected-warning {{will never be executed}} } - |