Skip to content
Snippets Groups Projects
  • Erich Keane's avatar
    59a70fe4
    Emit warning when throw exception in destruct or dealloc functions which has a · 59a70fe4
    Erich Keane authored
    (possible implicit) noexcept specifier
    
    Throwing in the destructor is not good (C++11 change try to not allow see below).
     But in reality, those codes are exist.
    C++11 [class.dtor]p3:
    
    A declaration of a destructor that does not have an exception-specification is 
    implicitly considered to have the same exception specification as an implicit 
    declaration.
    
    With this change, the application worked before may now run into runtime 
    termination. My goal here is to emit a warning to provide only possible info to 
    where the code may need to be changed.
    
    First there is no way, in compile time to identify the “throw” really throw out 
    of the function. Things like the call which throw out… To keep this simple, 
    when “throw” is seen, checking its enclosing function(only destructor and 
    dealloc functions) with noexcept(true) specifier emit warning.
    
    Here is implementation detail:
    A new member function CheckCXXThrowInNonThrowingFunc is added for class Sema 
    in Sema.h. It is used in the call to both BuildCXXThrow and 
    TransformCXXThrowExpr.
    
    The function basic check if the enclosing function with non-throwing noexcept 
    specifer, if so emit warning for it.
    
    The example of warning message like:
    k1.cpp:18:3: warning: ''~dependent_warn'' has a (possible implicit) non-throwing
    
        noexcept specifier. Throwing exception may cause termination.
            [-Wthrow-in-dtor]
            throw 1;
            ^
    
            k1.cpp:43:30: note: in instantiation of member function
    
            'dependent_warn<noexcept_fun>::~dependent_warn' requested here
    
            dependent_warn<noexcept_fun> f; // cause warning
    
    Differential Revision: https://reviews.llvm.org/D33333
    
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@306149 91177308-0d34-0410-b5e6-96231b3b80d8
    59a70fe4
    History
    Emit warning when throw exception in destruct or dealloc functions which has a
    Erich Keane authored
    (possible implicit) noexcept specifier
    
    Throwing in the destructor is not good (C++11 change try to not allow see below).
     But in reality, those codes are exist.
    C++11 [class.dtor]p3:
    
    A declaration of a destructor that does not have an exception-specification is 
    implicitly considered to have the same exception specification as an implicit 
    declaration.
    
    With this change, the application worked before may now run into runtime 
    termination. My goal here is to emit a warning to provide only possible info to 
    where the code may need to be changed.
    
    First there is no way, in compile time to identify the “throw” really throw out 
    of the function. Things like the call which throw out… To keep this simple, 
    when “throw” is seen, checking its enclosing function(only destructor and 
    dealloc functions) with noexcept(true) specifier emit warning.
    
    Here is implementation detail:
    A new member function CheckCXXThrowInNonThrowingFunc is added for class Sema 
    in Sema.h. It is used in the call to both BuildCXXThrow and 
    TransformCXXThrowExpr.
    
    The function basic check if the enclosing function with non-throwing noexcept 
    specifer, if so emit warning for it.
    
    The example of warning message like:
    k1.cpp:18:3: warning: ''~dependent_warn'' has a (possible implicit) non-throwing
    
        noexcept specifier. Throwing exception may cause termination.
            [-Wthrow-in-dtor]
            throw 1;
            ^
    
            k1.cpp:43:30: note: in instantiation of member function
    
            'dependent_warn<noexcept_fun>::~dependent_warn' requested here
    
            dependent_warn<noexcept_fun> f; // cause warning
    
    Differential Revision: https://reviews.llvm.org/D33333
    
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@306149 91177308-0d34-0410-b5e6-96231b3b80d8
Code owners
Assign users and groups as approvers for specific file changes. Learn more.