[cfe-commits] r70256 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp test/SemaCXX/exceptions.cpp www/cxx_status.html

Chris Lattner clattner at apple.com
Mon Apr 27 15:10:30 PDT 2009


On Apr 27, 2009, at 2:33 PM, Sebastian Redl wrote:

> Author: cornedbee
> Date: Mon Apr 27 16:33:24 2009
> New Revision: 70256
>
> URL: http://llvm.org/viewvc/llvm-project?rev=70256&view=rev
> Log:
> Track down return statements in the handlers of a function-try-block  
> of constructors. Meh ...

Hi Sebastian,

Instead of doing this as a treewalk, how about handling this in sema  
of a return.  Just check to see if the context is a construction  
function whose body is a try block there?

-Chris

>
>
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>    cfe/trunk/test/SemaCXX/exceptions.cpp
>    cfe/trunk/www/cxx_status.html
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Apr 27  
> 16:33:24 2009
> @@ -1204,6 +1204,8 @@
>   "cannot throw object of incomplete type %0">;
> def err_throw_incomplete_ptr : Error<
>   "cannot throw pointer to object of incomplete type %0">;
> +def err_return_in_constructor_handler : Error<
> +  "return in the catch of a function try block of a constructor is  
> illegal">;
>
> def err_invalid_use_of_function_type : Error<
>   "a function type is not allowed here">;
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Mon Apr 27 16:33:24 2009
> @@ -60,6 +60,7 @@
>   class ArrayType;
>   class LabelStmt;
>   class SwitchStmt;
> +  class CXXTryStmt;
>   class ExtVectorType;
>   class TypedefDecl;
>   class TemplateDecl;
> @@ -1225,6 +1226,7 @@
>   virtual OwningStmtResult ActOnCXXTryBlock(SourceLocation TryLoc,
>                                             StmtArg TryBlock,
>                                             MultiStmtArg Handlers);
> +  void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt  
> *TryBlock);
>
>   // 
> = 
> = 
> =-------------------------------------------------------------------- 
> ===//
>   // Expression Parsing Callbacks: SemaExpr.cpp.
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Apr 27 16:33:24 2009
> @@ -3054,6 +3054,11 @@
>   if (CurFunctionNeedsScopeChecking)
>     DiagnoseInvalidJumps(Body);
>
> +  // C++ constructors that have function-try-blocks can't have  
> return statements
> +  // in the handlers of that block. (C++ [except.handle]p14) Verify  
> this.
> +  if (isa<CXXConstructorDecl>(dcl) && isa<CXXTryStmt>(Body))
> +     
> DiagnoseReturnInConstructorExceptionHandler(cast<CXXTryStmt>(Body));
> +
>   return D;
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Apr 27 16:33:24 2009
> @@ -2664,3 +2664,24 @@
>   }
>   Fn->setDeleted();
> }
> +
> +static void SearchForReturnInStmt(Sema &Self, Stmt *S) {
> +  for (Stmt::child_iterator CI = S->child_begin(), E = S- 
> >child_end(); CI != E;
> +       ++CI) {
> +    Stmt *SubStmt = *CI;
> +    if (!SubStmt)
> +      continue;
> +    if (isa<ReturnStmt>(SubStmt))
> +      Self.Diag(SubStmt->getSourceRange().getBegin(),
> +           diag::err_return_in_constructor_handler);
> +    if (!isa<Expr>(SubStmt))
> +      SearchForReturnInStmt(Self, SubStmt);
> +  }
> +}
> +
> +void Sema::DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt  
> *TryBlock) {
> +  for (unsigned I = 0, E = TryBlock->getNumHandlers(); I != E; ++I) {
> +    CXXCatchStmt *Handler = TryBlock->getHandler(I);
> +    SearchForReturnInStmt(*this, Handler);
> +  }
> +}
>
> Modified: cfe/trunk/test/SemaCXX/exceptions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/exceptions.cpp?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/SemaCXX/exceptions.cpp (original)
> +++ cfe/trunk/test/SemaCXX/exceptions.cpp Mon Apr 27 16:33:24 2009
> @@ -68,3 +68,32 @@
>   goto l2; // expected-error {{illegal goto into protected scope}}
>   goto l1;
> }
> +
> +struct BadReturn {
> +  BadReturn() try {
> +  } catch(...) {
> +    // Try to hide
> +    try {
> +    } catch(...) {
> +      {
> +        if (0)
> +          return; // expected-error {{return in the catch of a  
> function try block of a constructor is illegal}}
> +      }
> +    }
> +  }
> +  BadReturn(int);
> +};
> +
> +BadReturn::BadReturn(int) try {
> +} catch(...) {
> +  // Try to hide
> +  try {
> +  } catch(int) {
> +    return; // expected-error {{return in the catch of a function  
> try block of a constructor is illegal}}
> +  } catch(...) {
> +    {
> +      if (0)
> +        return; // expected-error {{return in the catch of a  
> function try block of a constructor is illegal}}
> +    }
> +  }
> +}
>
> Modified: cfe/trunk/www/cxx_status.html
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=70256&r1=70255&r2=70256&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/www/cxx_status.html (original)
> +++ cfe/trunk/www/cxx_status.html Mon Apr 27 16:33:24 2009
> @@ -1664,7 +1664,7 @@
>   <td class="na" align="center">N/A</td>
>   <td class="advanced" align="center"></td>
>   <td></td>
> -  <td>Not all constraints are checked, such as existence of return  
> statements in function-try-block handlers of constructors</td>
> +  <td>Not all constraints are checked</td>
> </tr>
> <tr>
>   <td>  15.4 [except.spec]</td>
>
>
> _______________________________________________
> 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