aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp9
-rw-r--r--test/SemaCXX/array-bounds.cpp10
-rw-r--r--test/SemaCXX/warn-unreachable.cpp19
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}}
}
-