Just because a declaration has the same name as its containing class doesn't mean that it's a constructor. Fixes rdar://problem/6815988.

llvm-svn: 70436
This commit is contained in:
Anders Carlsson 2009-04-29 23:19:39 +00:00
parent e5f93b1e58
commit 118b098cd9
2 changed files with 15 additions and 10 deletions

View File

@ -1982,16 +1982,7 @@ void Parser::ParseDirectDeclarator(Declarator &D) {
if (Tok.is(tok::identifier)) {
assert(Tok.getIdentifierInfo() && "Not an identifier?");
// If this identifier is the name of the current class, it's a
// constructor name.
if (Actions.isCurrentClassName(*Tok.getIdentifierInfo(),CurScope)){
D.setConstructor(Actions.getTypeName(*Tok.getIdentifierInfo(),
Tok.getLocation(), CurScope),
Tok.getLocation());
// This is a normal identifier.
} else
D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
ConsumeToken();
goto PastIdentifier;
} else if (Tok.is(tok::annot_template_id)) {
@ -2101,6 +2092,15 @@ void Parser::ParseDirectDeclarator(Declarator &D) {
break;
}
ParseFunctionDeclarator(ConsumeParen(), D);
// If this identifier is the name of the current class, it's a
// constructor name.
if (IdentifierInfo *II = D.getIdentifier()) {
if (Actions.isCurrentClassName(*II, CurScope))
D.setConstructor(Actions.getTypeName(*II, D.getIdentifierLoc(),
CurScope),
D.getIdentifierLoc());
}
} else if (Tok.is(tok::l_square)) {
ParseBracketDeclarator(D);
} else {

View File

@ -40,3 +40,8 @@ extern y b;
struct Length {
Length l() const { return *this; }
};
// <rdar://problem/6815988>
struct mmst_reg{
char mmst_reg[10];
};