forked from OSchip/llvm-project
1) More additions for objective-c's qualifier type.
2) Fixed a test failure (which should have failed all along!). llvm-svn: 43589
This commit is contained in:
parent
e89b84ab29
commit
7a9c47480d
|
@ -555,8 +555,7 @@ void RewriteTest::SynthesizeObjcInternalStruct(ObjcInterfaceDecl *CDecl,
|
|||
|
||||
int NumIvars = CDecl->getIntfDeclNumIvars();
|
||||
// If no ivars and no root or if its root, directly or indirectly,
|
||||
// have no ivars (thus not synthesize)
|
||||
// then no need to synthesize this class either.
|
||||
// have no ivars (thus not synthesized) then no need to synthesize this class.
|
||||
if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl)))
|
||||
return;
|
||||
|
||||
|
|
|
@ -471,14 +471,13 @@ bool Parser::isObjCPropertyAttribute() {
|
|||
/// objc-type-qualifier
|
||||
/// objc-type-qualifiers objc-type-qualifier
|
||||
///
|
||||
Parser::TypeTy *Parser::ParseObjCTypeName() {
|
||||
Parser::TypeTy *Parser::ParseObjCTypeName(ObjcDeclSpec &DS) {
|
||||
assert(Tok.is(tok::l_paren) && "expected (");
|
||||
|
||||
SourceLocation LParenLoc = ConsumeParen(), RParenLoc;
|
||||
TypeTy *Ty = 0;
|
||||
|
||||
// Parse type qualifiers, in, inout, etc.
|
||||
ObjcDeclSpec DS;
|
||||
ParseObjcTypeQualifierList(DS);
|
||||
|
||||
if (isTypeSpecifierQualifier()) {
|
||||
|
@ -528,8 +527,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
|
|||
{
|
||||
// Parse the return type.
|
||||
TypeTy *ReturnType = 0;
|
||||
ObjcDeclSpec DSRet;
|
||||
if (Tok.is(tok::l_paren))
|
||||
ReturnType = ParseObjCTypeName();
|
||||
ReturnType = ParseObjCTypeName(DSRet);
|
||||
SourceLocation selLoc;
|
||||
IdentifierInfo *SelIdent = ParseObjCSelector(selLoc);
|
||||
if (Tok.isNot(tok::colon)) {
|
||||
|
@ -546,12 +546,13 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
|
|||
|
||||
Selector Sel = PP.getSelectorTable().getNullarySelector(SelIdent);
|
||||
return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(),
|
||||
mType, ReturnType, Sel,
|
||||
0, 0, MethodAttrs, MethodImplKind);
|
||||
mType, DSRet, ReturnType, Sel,
|
||||
0, 0, 0, MethodAttrs, MethodImplKind);
|
||||
}
|
||||
|
||||
llvm::SmallVector<IdentifierInfo *, 12> KeyIdents;
|
||||
llvm::SmallVector<Action::TypeTy *, 12> KeyTypes;
|
||||
llvm::SmallVector<ObjcDeclSpec, 12> ArgTypeQuals;
|
||||
llvm::SmallVector<IdentifierInfo *, 12> ArgNames;
|
||||
|
||||
Action::TypeTy *TypeInfo;
|
||||
|
@ -564,11 +565,14 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
|
|||
break;
|
||||
}
|
||||
ConsumeToken(); // Eat the ':'.
|
||||
if (Tok.is(tok::l_paren)) // Parse the argument type.
|
||||
TypeInfo = ParseObjCTypeName();
|
||||
ObjcDeclSpec DSType;
|
||||
if (Tok.is(tok::l_paren)) { // Parse the argument type.
|
||||
TypeInfo = ParseObjCTypeName(DSType);
|
||||
}
|
||||
else
|
||||
TypeInfo = 0;
|
||||
KeyTypes.push_back(TypeInfo);
|
||||
ArgTypeQuals.push_back(DSType);
|
||||
|
||||
// If attributes exist before the argument name, parse them.
|
||||
if (getLang().ObjC2 && Tok.is(tok::kw___attribute))
|
||||
|
@ -613,8 +617,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
|
|||
Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(),
|
||||
&KeyIdents[0]);
|
||||
return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(),
|
||||
mType, ReturnType, Sel,
|
||||
&KeyTypes[0], &ArgNames[0],
|
||||
mType, DSRet, ReturnType, Sel,
|
||||
&ArgTypeQuals[0], &KeyTypes[0],
|
||||
&ArgNames[0],
|
||||
MethodAttrs, MethodImplKind);
|
||||
}
|
||||
|
||||
|
|
|
@ -524,10 +524,11 @@ public:
|
|||
virtual DeclTy *ActOnMethodDeclaration(
|
||||
SourceLocation BeginLoc, // location of the + or -.
|
||||
SourceLocation EndLoc, // location of the ; or {.
|
||||
tok::TokenKind MethodType, TypeTy *ReturnType, Selector Sel,
|
||||
tok::TokenKind MethodType, ObjcDeclSpec &ReturnQT, TypeTy *ReturnType,
|
||||
Selector Sel,
|
||||
// optional arguments. The number of types/arguments is obtained
|
||||
// from the Sel.getNumArgs().
|
||||
TypeTy **ArgTypes, IdentifierInfo **ArgNames,
|
||||
ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames,
|
||||
AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind);
|
||||
|
||||
// ActOnClassMessage - used for both unary and keyword messages.
|
||||
|
|
|
@ -1288,6 +1288,9 @@ void Sema::CheckImplementationIvars(ObjcImplementationDecl *ImpDecl,
|
|||
IDecl->addInstanceVariablesToClass(ivars, numIvars, RBrace);
|
||||
return;
|
||||
}
|
||||
// If implementation has empty ivar list, just return.
|
||||
if (numIvars == 0)
|
||||
return;
|
||||
|
||||
assert(ivars && "missing @implementation ivars");
|
||||
|
||||
|
@ -1967,10 +1970,11 @@ void Sema::ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *classDecl,
|
|||
|
||||
Sema::DeclTy *Sema::ActOnMethodDeclaration(
|
||||
SourceLocation MethodLoc, SourceLocation EndLoc,
|
||||
tok::TokenKind MethodType, TypeTy *ReturnType, Selector Sel,
|
||||
tok::TokenKind MethodType, ObjcDeclSpec &ReturnQT, TypeTy *ReturnType,
|
||||
Selector Sel,
|
||||
// optional arguments. The number of types/arguments is obtained
|
||||
// from the Sel.getNumArgs().
|
||||
TypeTy **ArgTypes, IdentifierInfo **ArgNames,
|
||||
ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames,
|
||||
AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind) {
|
||||
llvm::SmallVector<ParmVarDecl*, 16> Params;
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
namespace clang {
|
||||
// Semantic.
|
||||
class DeclSpec;
|
||||
class ObjcDeclSpec;
|
||||
class Declarator;
|
||||
class AttributeList;
|
||||
// Parse.
|
||||
|
@ -529,8 +530,10 @@ public:
|
|||
SourceLocation BeginLoc, // location of the + or -.
|
||||
SourceLocation EndLoc, // location of the ; or {.
|
||||
tok::TokenKind MethodType, // tok::minus for instance, tok::plus for class.
|
||||
ObjcDeclSpec &ReturnQT, // for return type's in inout etc.
|
||||
TypeTy *ReturnType, // the method return type.
|
||||
Selector Sel, // a unique name for the method.
|
||||
ObjcDeclSpec *ArgQT, // for arguments' in inout etc.
|
||||
TypeTy **ArgTypes, // non-zero when Sel.getNumArgs() > 0
|
||||
IdentifierInfo **ArgNames, // non-zero when Sel.getNumArgs() > 0
|
||||
AttributeList *AttrList, // optional
|
||||
|
|
|
@ -293,7 +293,7 @@ private:
|
|||
IdentifierInfo *ObjcPropertyAttrs[objc_NumAttrs];
|
||||
bool isObjCPropertyAttribute();
|
||||
|
||||
TypeTy *ParseObjCTypeName();
|
||||
TypeTy *ParseObjCTypeName(ObjcDeclSpec &DS);
|
||||
void ParseObjCMethodRequirement();
|
||||
DeclTy *ParseObjCMethodPrototype(DeclTy *classOrCat,
|
||||
tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
|
||||
|
|
Loading…
Reference in New Issue