[cfe-commits] r80055 - in /cfe/trunk: include/clang/Parse/Action.h lib/Parse/ParseExpr.cpp lib/Sema/Sema.h lib/Sema/SemaExpr.cpp lib/Sema/SemaExprCXX.cpp

Douglas Gregor dgregor at apple.com
Wed Aug 26 10:01:49 PDT 2009


On Aug 25, 2009, at 4:46 PM, Anders Carlsson wrote:

> Author: andersca
> Date: Tue Aug 25 18:46:41 2009
> New Revision: 80055
>
> URL: http://llvm.org/viewvc/llvm-project?rev=80055&view=rev
> Log:
> Parsing of pseudo-destructors.

Cool.

> Modified:
>    cfe/trunk/include/clang/Parse/Action.h
>    cfe/trunk/lib/Parse/ParseExpr.cpp
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>
> Modified: cfe/trunk/include/clang/Parse/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=80055&r1=80054&r2=80055&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Parse/Action.h (original)
> +++ cfe/trunk/include/clang/Parse/Action.h Tue Aug 25 18:46:41 2009
> @@ -1263,7 +1263,16 @@
>     return ExprEmpty();
>   }
>
> -
> +  virtual OwningExprResult
> +  ActOnPseudoDtorReferenceExpr(Scope *S, ExprArg Base,
> +                               SourceLocation OpLoc,
> +                               tok::TokenKind OpKind,
> +                               SourceLocation ClassNameLoc,
> +                               IdentifierInfo *ClassName,
> +                               const CXXScopeSpec *SS = 0) {
> +    return ExprEmpty();
> +  }

No documentation? :)

>   /// ActOnFinishFullExpr - Called whenever a full expression has  
> been parsed.
>   /// (C++ [intro.execution]p12).
>   virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr) {
>
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=80055&r1=80054&r2=80055&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Tue Aug 25 18:46:41 2009
> @@ -933,18 +933,34 @@
>         ParseOptionalCXXScopeSpecifier(SS);
>       }
>
> -      if (Tok.isNot(tok::identifier)) {
> +      if (Tok.is(tok::identifier)) {
> +        if (!LHS.isInvalid())
> +          LHS = Actions.ActOnMemberReferenceExpr(CurScope, move 
> (LHS), OpLoc,
> +                                                 OpKind,  
> Tok.getLocation(),
> +                                                  
> *Tok.getIdentifierInfo(),
> +                                                 ObjCImpDecl, &SS);
> +      } else if (getLang().CPlusPlus && Tok.is(tok::tilde)) {
> +        // We have a C++ pseudo-destructor.
> +
> +        // Consume the tilde.
> +        ConsumeToken();
> +
> +        if (!Tok.is(tok::identifier)) {
> +          Diag(Tok, diag::err_expected_ident);
> +          return ExprError();
> +        }
> +
> +        if (!LHS.isInvalid())
> +          LHS = Actions.ActOnPseudoDtorReferenceExpr(CurScope, move 
> (LHS),
> +                                                     OpLoc, OpKind,
> +                                                     Tok.getLocation 
> (),
> +                                                      
> Tok.getIdentifierInfo(),
> +                                                     &SS);

There's an oddity in the grammar here that might cause confusion. In  
particular, something like this:

   t.~T()

syntactically looks like both a

   postfix-expression . pseudo-destructor-name

and a

   postfix-expression . template[opt] id-expression

so both go through the same path in the parser. Whether it is actually  
a pseudo-destructor or whether it is a call to the destructor is  
something that semantic analysis determines, which makes the action  
name ActOnPseudoDtorReferenceExpr a bit misleading. Perhaps we should  
call it ActOnDestructorReferenceExpr?

> +Sema::OwningExprResult
> +Sema::ActOnPseudoDtorReferenceExpr(Scope *S, ExprArg Base,
> +                                   SourceLocation OpLoc,
> +                                   tok::TokenKind OpKind,
> +                                   SourceLocation ClassNameLoc,
> +                                   IdentifierInfo *ClassName,
> +                                   const CXXScopeSpec *SS) {
> +  if (SS && SS->isInvalid())
> +    return ExprError();
> +
> +  // Since this might be a postfix expression, get rid of  
> ParenListExprs.
> +  Base = MaybeConvertParenListExprToParenExpr(S, move(Base));
> +
> +  Expr *BaseExpr = Base.takeAs<Expr>();
> +  assert(BaseExpr && "no record expression");
> +
> +  // Perform default conversions.
> +  DefaultFunctionArrayConversion(BaseExpr);

Should check here to determine whether the type of Base is a scalar  
type or pointer to a scalar type (depending on . vs ->), and of course  
turn this into an actual member reference (e.g., via a call to  
ActOnMemberReferenceExpr) when the type is a class type.

	- Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20090826/0c13545a/attachment.html>


More information about the cfe-commits mailing list