r212422 - Sema: Check that __leave is contained in a __try block.

Nico Weber thakis at chromium.org
Sun Jul 6 17:22:13 PDT 2014


On Sun, Jul 6, 2014 at 4:25 PM, Alp Toker <alp at nuanti.com> wrote:

>
> On 07/07/2014 01:53, Nico Weber wrote:
>
>> Author: nico
>> Date: Sun Jul  6 17:53:19 2014
>> New Revision: 212422
>>
>> URL:http://llvm.org/viewvc/llvm-project?rev=212422&view=rev
>> Log:
>> Sema: Check that __leave is contained in a __try block.
>>
>> Give scope a SEHTryScope bit, set that in ParseSEHTry(), and let Sema
>> walk the scope chain to find the SEHTry parent on __leave statements.
>> (They are rare enough that it seems better to do the walk instead of
>> giving Scope a SEHTryParent pointer -- this is similar to AtCatchScope.)
>>
>> Modified:
>>      cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>      cfe/trunk/include/clang/Sema/Scope.h
>>      cfe/trunk/lib/Parse/ParseStmt.cpp
>>      cfe/trunk/lib/Sema/Scope.cpp
>>      cfe/trunk/lib/Sema/SemaStmt.cpp
>>      cfe/trunk/test/Sema/__try.c
>>      cfe/trunk/test/SemaCXX/__try.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
>> DiagnosticSemaKinds.td?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Jul  6
>> 17:53:19 2014
>> @@ -5155,6 +5155,8 @@ def err_need_header_before_ms_uuidof : E
>>     "you need to include <guiddef.h> before using the '__uuidof'
>> operator">;
>>   def err_ms___leave_unimplemented : Error<
>>     "__leave support not implemented yet">;
>> +def err_ms___leave_not_in___try : Error<
>> +  "'__leave' statement not in __try block">;
>>   def err_uuidof_without_guid : Error<
>>     "cannot call operator __uuidof on a type with no GUID">;
>>   def err_uuidof_with_multiple_guids : Error<
>>
>
> The triple underscores don't add much here, how about just
> 'err_ms_leave_not_in_try' and 'err_ms_leave_unimplemented' to match the
> style of others like 'like the err_uuidof_without_guid' immediately below?


There's a ___ for a __block diagnostic elsewhere in this file. Since there
isn't a consistency advantage either way I left it as is for now.
(tok::kw___leave has the triple underscore too, so if someone wnats wants
to make this all consistent, adding __s to uuidof is probably the way to
go.)


>
>
>
>  Modified: cfe/trunk/include/clang/Sema/Scope.h
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/
>> include/clang/Sema/Scope.h?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/include/clang/Sema/Scope.h (original)
>> +++ cfe/trunk/include/clang/Sema/Scope.h Sun Jul  6 17:53:19 2014
>> @@ -114,6 +114,9 @@ public:
>>         /// This scope corresponds to an enum.
>>       EnumScope = 0x40000,
>> +
>> +    /// This scope corresponds to a SEH try.
>> +    SEHTryScope = 0x80000,
>>     };
>>   private:
>>     /// The parent scope for this scope.  This is null for the
>> translation-unit
>> @@ -398,6 +401,9 @@ public:
>>     /// \brief Determine whether this scope is a C++ 'try' block.
>>     bool isTryScope() const { return getFlags() & Scope::TryScope; }
>>   +  /// \brief Determine whether this scope is a SEH '__try' block.
>> +  bool isSEHTryScope() const { return getFlags() & Scope::SEHTryScope; }
>> +
>>     /// containedInPrototypeScope - Return true if this or a parent scope
>>     /// is a FunctionPrototypeScope.
>>     bool containedInPrototypeScope() const;
>>
>> Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>> Parse/ParseStmt.cpp?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseStmt.cpp Sun Jul  6 17:53:19 2014
>> @@ -427,7 +427,8 @@ StmtResult Parser::ParseSEHTryBlockCommo
>>     if(Tok.isNot(tok::l_brace))
>>       return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
>>   -  StmtResult TryBlock(ParseCompoundStatement());
>> +  StmtResult TryBlock(ParseCompoundStatement(/*isStmtExpr=*/false,
>> +                      Scope::DeclScope | Scope::SEHTryScope));
>>     if(TryBlock.isInvalid())
>>       return TryBlock;
>>
>> Modified: cfe/trunk/lib/Sema/Scope.cpp
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>> Sema/Scope.cpp?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Sema/Scope.cpp (original)
>> +++ cfe/trunk/lib/Sema/Scope.cpp Sun Jul  6 17:53:19 2014
>> @@ -182,6 +182,9 @@ void Scope::dumpImpl(raw_ostream &OS) co
>>       } else if (Flags & FnTryCatchScope) {
>>         OS << "FnTryCatchScope";
>>         Flags &= ~FnTryCatchScope;
>> +    } else if (Flags & SEHTryScope) {
>> +      OS << "SEHTryScope";
>> +      Flags &= ~SEHTryScope;
>>       } else if (Flags & OpenMPDirectiveScope) {
>>         OS << "OpenMPDirectiveScope";
>>         Flags &= ~OpenMPDirectiveScope;
>>
>> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>> Sema/SemaStmt.cpp?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Sun Jul  6 17:53:19 2014
>> @@ -3279,6 +3279,12 @@ Sema::ActOnSEHFinallyBlock(SourceLocatio
>>     StmtResult
>>   Sema::ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope) {
>> +  Scope *SEHTryParent = CurScope;
>> +  while (SEHTryParent && !SEHTryParent->isSEHTryScope())
>> +    SEHTryParent = SEHTryParent->getParent();
>> +  if (!SEHTryParent)
>> +    return StmtError(Diag(Loc, diag::err_ms___leave_not_in___try));
>> +
>>     return StmtError(Diag(Loc, diag::err_ms___leave_unimplemented));
>>   }
>>
>> Modified: cfe/trunk/test/Sema/__try.c
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
>> Sema/__try.c?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/Sema/__try.c (original)
>> +++ cfe/trunk/test/Sema/__try.c Sun Jul  6 17:53:19 2014
>> @@ -172,26 +172,23 @@ void TEST() {
>>   }
>>     void test___leave() {
>>
>
> Since this is a sema test, how about naming it after the semantics being
> tested -- void test_seh_leave_stmt() ?
>

Sure, done as part of r212425.

Thanks!


>
> Alp.
>
>
>
>  -  // FIXME: should say "__leave stmt not in __try block":
>> -  __leave; // expected-error{{not implemented yet}}
>> +  __leave; // expected-error{{'__leave' statement not in __try block}}
>> +
>>     __try {
>>       // FIXME: should be fine
>>       __leave; // expected-error{{not implemented yet}}
>>       // FIXME: should say "expected ';' after __leave statement"
>>       __leave 4; // expected-error{{not implemented yet}}
>> expected-warning{{expression result unused}}
>>     } __except(1) {
>> -    // FIXME: should say "__leave stmt not in __try block":
>> -    __leave; // expected-error{{not implemented yet}}
>> +    __leave; // expected-error{{'__leave' statement not in __try block}}
>>     }
>>       __try {
>>       // FIXME: should be fine
>>       __leave; // expected-error{{not implemented yet}}
>>     } __finally {
>> -    // FIXME: should say "__leave stmt not in __try block":
>> -    __leave; // expected-error{{not implemented yet}}
>> +    __leave; // expected-error{{'__leave' statement not in __try block}}
>>     }
>> -  // FIXME: should say "__leave stmt not in __try block":
>> -  __leave; // expected-error{{not implemented yet}}
>> +  __leave; // expected-error{{'__leave' statement not in __try block}}
>>   }
>>
>> Modified: cfe/trunk/test/SemaCXX/__try.cpp
>> URL:http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
>> SemaCXX/__try.cpp?rev=212422&r1=212421&r2=212422&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/SemaCXX/__try.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/__try.cpp Sun Jul  6 17:53:19 2014
>> @@ -83,8 +83,7 @@ void test___leave() {
>>     // Clang accepts try with __finally. MSVC doesn't. (Maybe a Borland
>> thing?)
>>     // __leave in mixed blocks isn't supported.
>>     try {
>> -    // FIXME: should say "__leave stmt not in __try block":
>> -    __leave; // expected-error{{not implemented yet}}
>> +    __leave; // expected-error{{'__leave' statement not in __try block}}
>>     } __finally {
>>     }
>>   }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
> --
> http://www.nuanti.com
> the browser experts
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140706/59a30175/attachment.html>


More information about the cfe-commits mailing list