[cfe-commits] r148774 - in /cfe/trunk: lib/Sema/AnalysisBasedWarnings.cpp test/SemaCXX/array-bounds.cpp test/SemaCXX/warn-unreachable.cpp

David Blaikie dblaikie at gmail.com
Mon Jan 23 20:36:08 PST 2012


Sorry about this (& a few future) commits - committed from the wrong
git branch, evidently. I'll back them out ASAP.

On Mon, Jan 23, 2012 at 8:29 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Mon Jan 23 22:29:18 2012
> New Revision: 148774
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148774&view=rev
> Log:
> Simple hack to do unreachable code analysis on template patterns.
>
> Modified:
>    cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
>    cfe/trunk/test/SemaCXX/array-bounds.cpp
>    cfe/trunk/test/SemaCXX/warn-unreachable.cpp
>
> Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=148774&r1=148773&r2=148774&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
> +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Mon Jan 23 22:29:18 2012
> @@ -782,8 +782,7 @@
>     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 @@
>   // 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 @@
>
>
>   // 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 @@
>   }
>
>   // 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);
>
> Modified: cfe/trunk/test/SemaCXX/array-bounds.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/array-bounds.cpp?rev=148774&r1=148773&r2=148774&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/array-bounds.cpp (original)
> +++ cfe/trunk/test/SemaCXX/array-bounds.cpp Mon Jan 23 22:29:18 2012
> @@ -73,17 +73,21 @@
>   (*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
>
> Modified: cfe/trunk/test/SemaCXX/warn-unreachable.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unreachable.cpp?rev=148774&r1=148773&r2=148774&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/warn-unreachable.cpp (original)
> +++ cfe/trunk/test/SemaCXX/warn-unreachable.cpp Mon Jan 23 22:29:18 2012
> @@ -98,6 +98,24 @@
>   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 @@
>   halt();
>   dead(); // expected-warning {{will never be executed}}
>  }
> -
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list