[cfe-dev] [PATCH]: Parsing for C++ classes
Eli Friedman
eli.friedman at gmail.com
Fri Jun 20 11:13:29 PDT 2008
On Fri, Jun 20, 2008 at 7:14 AM, Argiris Kirtzidis <akyrtzi at gmail.com> wrote:
> I've attached patches against the latest trunk of Parser and Sema changes
> for C++ classes support.
Some rough comments looking over the code:
In Parser::ParseCXXMemberSpecification:
+ AccessSpecifier AS = getAccessSpecifierIfPresent();
+ if (AS != AS_none) {
+ // We encountered a C++ access specifier.
+ CurAS = AS;
+ ConsumeToken();
+
+ if (Tok.is(tok::colon))
+ ConsumeToken();
+ else
+ Diag(Tok.getLocation(), diag::err_expected_colon);
I think you forgot to put a "continue;" here. (Consider the testcase
"class A {public:private:int a;public:};".)
+ }
In Parser::ParseCXXClassMemberDeclaration:
You mention the pure specifier in the comments, but it looks like you
forgot to actually implement it (or at least put in a FIXME where it
should be implemented).
In Parser::SkipUntil:
Standard large patch advice: split out changes that can be easily
split out. (Here, the change isn't especially useful without the rest
of the patch, but it makes review easier and the svn history a bit
cleaner.)
In Parser::TryParseFunctionOrCXXMethodDef:
+ Tok.is(tok::colon) || // int X(): -> not a function def
Hmm? Doesn't a colon guarantee that this is a function definition
with a ctor-initializer? Or are you planning on handling this case
some other way?
- isDeclarationSpecifier())) { // int X(f) int f; {}
+ (!getLang().CPlusPlus &&
+ isDeclarationSpecifier()))) { // int X(f) int f; {}
This change should be split out.
In Sema::ActOnIdentifierExpr:
+ // FIXME: Should this use a new expr for a direct reference, instead of
+ // turning it into "this->field" ? Or else a MemberExpr with null base ?
+ ExprResult ThisExpr = ActOnCXXThis(Loc);
+ return new MemberExpr(static_cast<Expr*>(ThisExpr.Val),
+ true, FD, Loc, FD->getType());
I'd say this is fine, except that you should use an empty
SourceLocation for the artificial "this" so it's distinguishable from
a real MemberExpr. clang currently uses this technique for
initializer lists.
About the Sema Decl context stuff:
It is in fact possible to nest Function/MethodDecls with C++. Simple example:
int a() {
static int b;
class C {
public:
int a() {
return b;
}
} r;
return r.a();
}
If I'm not mistaken, member() should be parsed in the context of
func(). (This is somewhat evil/not especially useful, but as far as I
can tell, it's legal.)
In general, this looks like a high-quality patch. Nice work!
-Eli
More information about the cfe-dev
mailing list