forked from OSchip/llvm-project
In Objective-C++, allow the keyword 'class' to be used as a property
name for dot syntax, e.g., NSObject.class or foo.class. For other C++-keywords-as-method-names, use message send syntax. Fixes <rdar://problem/10794452>. llvm-svn: 150710
This commit is contained in:
parent
bc6ba479b6
commit
36107ade6f
|
@ -726,7 +726,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
|
|||
(&II == Ident_super && getCurScope()->isInObjcMethodScope()))) {
|
||||
ConsumeToken();
|
||||
|
||||
if (Tok.isNot(tok::identifier)) {
|
||||
// Allow either an identifier or the keyword 'class' (in C++).
|
||||
if (Tok.isNot(tok::identifier) &&
|
||||
!(getLang().CPlusPlus && Tok.is(tok::kw_class))) {
|
||||
Diag(Tok, diag::err_expected_property_name);
|
||||
return ExprError();
|
||||
}
|
||||
|
@ -1406,11 +1408,23 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
|
|||
// FIXME: Add support for explicit call of template constructor.
|
||||
SourceLocation TemplateKWLoc;
|
||||
UnqualifiedId Name;
|
||||
if (ParseUnqualifiedId(SS,
|
||||
/*EnteringContext=*/false,
|
||||
/*AllowDestructorName=*/true,
|
||||
/*AllowConstructorName=*/ getLang().MicrosoftExt,
|
||||
ObjectType, TemplateKWLoc, Name))
|
||||
if (getLang().ObjC2 && OpKind == tok::period && Tok.is(tok::kw_class)) {
|
||||
// Objective-C++:
|
||||
// After a '.' in a member access expression, treat the keyword
|
||||
// 'class' as if it were an identifier.
|
||||
//
|
||||
// This hack allows property access to the 'class' method because it is
|
||||
// such a common method name. For other C++ keywords that are
|
||||
// Objective-C method names, one must use the message send syntax.
|
||||
IdentifierInfo *Id = Tok.getIdentifierInfo();
|
||||
SourceLocation Loc = ConsumeToken();
|
||||
Name.setIdentifier(Id, Loc);
|
||||
} else if (ParseUnqualifiedId(SS,
|
||||
/*EnteringContext=*/false,
|
||||
/*AllowDestructorName=*/true,
|
||||
/*AllowConstructorName=*/
|
||||
getLang().MicrosoftExt,
|
||||
ObjectType, TemplateKWLoc, Name))
|
||||
LHS = ExprError();
|
||||
|
||||
if (!LHS.isInvalid())
|
||||
|
|
|
@ -68,3 +68,20 @@ void test5(Test5* t5) {
|
|||
if (t5->count < 2) { }
|
||||
}
|
||||
|
||||
|
||||
@interface Test6
|
||||
+ (Class)class;
|
||||
- (Class)class;
|
||||
@end
|
||||
|
||||
void test6(Test6 *t6) {
|
||||
Class x = t6.class;
|
||||
Class x2 = Test6.class;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void test6_template(T *t6) {
|
||||
Class x = t6.class;
|
||||
}
|
||||
|
||||
template void test6_template(Test6*);
|
||||
|
|
Loading…
Reference in New Issue