aaron.ballman added a comment.

In https://reviews.llvm.org/D33333#761126, @jyu2 wrote:

> In https://reviews.llvm.org/D33333#760431, @aaron.ballman wrote:
>
> > In https://reviews.llvm.org/D33333#760419, @jyu2 wrote:
> >
> > > In https://reviews.llvm.org/D33333#760149, @aaron.ballman wrote:
> > >
> > > > As an FYI, there is a related check currently under development in 
> > > > clang-tidy; we probably should not duplicate this functionality in both 
> > > > places. See https://reviews.llvm.org/D19201 for the other review.
> > >
> > >
> > > To my understanding, clang-tidy is kind of source check tool.  It does 
> > > more intensive checking than compiler.  
> > >  My purpose here is to emit minimum warning form compiler, in case, 
> > > clang-tidy is not used.
> >
> >
> > Sort of correct. clang-tidy doesn't necessarily do more intensive checking 
> > than the compiler. It's more an AST matching source checking tool for 
> > checks that are either expensive or have a higher false-positive rate than 
> > we'd want to see in the frontend.
> >
> > I think that this particular check should probably be in the frontend, like 
> > you're doing. My biggest concern is that we do not duplicate functionality 
> > between the two tools. https://reviews.llvm.org/D19201 has has a 
> > considerable amount of review, so you should look at the test cases there 
> > and ensure you are handling them (including the fixits). Hopefully your 
> > patch ends up covering all of the functionality in the clang-tidy patch.
> >
> > > In https://reviews.llvm.org/D33333#760353, @Prazek wrote:
> > > 
> > >> Could you add similar tests as the ones that Stanislaw provied in his 
> > >> patch?
> > >>  Like the one with checking if throw is catched, or the conditional 
> > >> noexcept (by a macro, etc)
> > > 
> > > 
> > > Good idea!  Could add “marco” test for this.  But I am not sure compiler 
> > > want to add check for throw caught by different catch handler.  Because 
> > > at compile time, compiler can not statically determine which catch 
> > > handler will be used to caught the exception on all time.   I would think 
> > > that is pragma's responsibility.
> > > 
> > > For example:
> > > 
> > >   If (a) throw A else throw B;  
> > >    
> > >    
> > > 
> > > My main concern there is implicit noexcept gets set by compiler, which 
> > > cause runtime to termination.
>
>
> As I said, I don't think checking throw type matching catch handler type is 
> compiler's job.  I'd like either silence all warning for that.  What do you 
> think?


Consider the following cases:

  void f() noexcept { // Should not diagnose
    try {
      throw 12;
    } catch (int) {
    }
  }
  
  void g() noexcept { // Should not diagnose
    try {
      throw 12;
    } catch (...) {
    }
  }
  
  void h() noexcept { // Should diagnose
    try {
      throw 12;
    } catch (const char *) {
    }
  }
  
  void i() noexcept { // Should diagnose
    try {
      throw 12;
    } catch (int) {
      throw;
    }
  }
  
  void j() noexcept { // Should diagnose
    try {
      throw 12;
    } catch (int) {
      throw "haha";
    }
  }
  
  void k() noexcept { // Should diagnose
    try {
      throw 12;
    } catch (...) {
      throw;
    }
  }

I think the expected behavior in these cases is reasonable (and can be done 
with a CFG) rather than manually looking at the scope stack like you're doing.



================
Comment at: include/clang/Basic/DiagnosticGroups.td:140
 def Exceptions : DiagGroup<"exceptions">;
+def ThrowInNoexceptFunc : DiagGroup<"throw-in-noexcept-function">;
 
----------------
No need to add a group for this; you can define one inline with the warning, 
but perhaps the exceptions group already covers it.


================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6335
+def warn_throw_in_noexcept_func 
+    : Warning<"'%0' function assumed not to throw an exception but does. "
+      "Throwing exception may cause termination.">, 
----------------
Do not quote %0. Also, remove the full-stop and capitalized "Throwing". 
Diagnostics are not complete sentences. I think it should probably read `"%0 
has a non-throwing exception specification but can still throw, resulting in 
unexpected program termination"` (or something along those lines).


================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6342
+def note_throw_in_function 
+    : Note<"__declspec(nothrow), throw(), noexcept(true), or noexcept was "
+      "specified on the function">;
----------------
Rather than make the note spell out all the various ways a function can be 
nothrow, we should either say "nonthrowing function declare here" or specify 
which reason the function is not throwing using %select.


================
Comment at: include/clang/Sema/Sema.h:4970
   bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr 
*E);
+  /// Check if throw is used in function with non-throwing noexcept 
+  /// specifier.
----------------
with non-throwing -> with a non-throwing


================
Comment at: lib/Sema/SemaExprCXX.cpp:690
 
+static bool isNoexcept(const FunctionDecl * FD)
+{
----------------
Please run clang-format over the patch (the asterisk binds to `FD` and the 
curly brace should be on this line).


================
Comment at: lib/Sema/SemaExprCXX.cpp:692
+{
+  if (const FunctionProtoType *FPT = 
FD->getType()->castAs<FunctionProtoType>()) 
+    if (FPT->getExceptionSpecType() != EST_None &&
----------------
Can use `const auto *` here.


================
Comment at: lib/Sema/SemaExprCXX.cpp:693-696
+    if (FPT->getExceptionSpecType() != EST_None &&
+        FPT->getNoexceptSpec(FD->getASTContext()) ==
+                                   FunctionProtoType::NR_Nothrow) 
+      return true;
----------------
Is there a reason for doing this rather than simply calling 
`FunctionProtoType::isNothrow()`?


================
Comment at: lib/Sema/SemaExprCXX.cpp:712
+  bool isInCXXTryBlock = false;
+  for (auto *S = getCurScope(); S; S = S->getParent())
+    if (S->getFlags() & (Scope::TryScope)) {
----------------
Please spell out the type explicitly here.


================
Comment at: lib/Sema/SemaExprCXX.cpp:713
+  for (auto *S = getCurScope(); S; S = S->getParent())
+    if (S->getFlags() & (Scope::TryScope)) {
+      isInCXXTryBlock = true;
----------------
Remove spurious parens.


================
Comment at: lib/Sema/SemaExprCXX.cpp:716
+      break;
+    } else if (S->getFlags() & (Scope::FnScope)) 
+      break;
----------------
Same here.


================
Comment at: test/CXX/except/except.spec/p11.cpp:5
 // This is the "let the user shoot themselves in the foot" clause.
-void f() noexcept {
+void f() { 
   throw 0; // no-error
----------------
Please modify this test to expect diagnostics rather than remove the `noexcept` 
from the test. This is testing specific features of the standard.


================
Comment at: test/SemaCXX/warn-throw-out-dtor.cpp:1
+// RUN: %clang_cc1 %s  -fdelayed-template-parsing -fcxx-exceptions 
-fexceptions -fsyntax-only -Wthrow-in-noexcept-function -verify -std=c++11
+struct A {
----------------
Please remove the svn props from this file.


https://reviews.llvm.org/D33333



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to