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
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to