forked from OSchip/llvm-project
When parsing something that looks like an ill-formed
protocol-qualifier list without a leading type (e.g., <#blah#>), don't complain about it being an archaic protocol-qualifier list unless it actually parses as one. llvm-svn: 119805
This commit is contained in:
parent
2e49eaa92f
commit
3a001f48e4
|
@ -951,7 +951,7 @@ private:
|
|||
bool WarnOnDeclarations,
|
||||
SourceLocation &LAngleLoc,
|
||||
SourceLocation &EndProtoLoc);
|
||||
void ParseObjCProtocolQualifiers(DeclSpec &DS);
|
||||
bool ParseObjCProtocolQualifiers(DeclSpec &DS);
|
||||
void ParseObjCInterfaceDeclList(Decl *interfaceDecl,
|
||||
tok::ObjCKeywordKind contextKey);
|
||||
Decl *ParseObjCAtProtocolDeclaration(SourceLocation atLoc,
|
||||
|
|
|
@ -1434,11 +1434,10 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
|
|||
if (DS.hasTypeSpecifier() || !getLang().ObjC1)
|
||||
goto DoneWithDeclSpec;
|
||||
|
||||
ParseObjCProtocolQualifiers(DS);
|
||||
|
||||
Diag(Loc, diag::warn_objc_protocol_qualifier_missing_id)
|
||||
<< FixItHint::CreateInsertion(Loc, "id")
|
||||
<< SourceRange(Loc, DS.getSourceRange().getEnd());
|
||||
if (!ParseObjCProtocolQualifiers(DS))
|
||||
Diag(Loc, diag::warn_objc_protocol_qualifier_missing_id)
|
||||
<< FixItHint::CreateInsertion(Loc, "id")
|
||||
<< SourceRange(Loc, DS.getSourceRange().getEnd());
|
||||
|
||||
// Need to support trailing type qualifiers (e.g. "id<p> const").
|
||||
// If a type specifier follows, it will be diagnosed elsewhere.
|
||||
|
|
|
@ -1038,18 +1038,19 @@ ParseObjCProtocolReferences(llvm::SmallVectorImpl<Decl *> &Protocols,
|
|||
|
||||
/// \brief Parse the Objective-C protocol qualifiers that follow a typename
|
||||
/// in a decl-specifier-seq, starting at the '<'.
|
||||
void Parser::ParseObjCProtocolQualifiers(DeclSpec &DS) {
|
||||
bool Parser::ParseObjCProtocolQualifiers(DeclSpec &DS) {
|
||||
assert(Tok.is(tok::less) && "Protocol qualifiers start with '<'");
|
||||
assert(getLang().ObjC1 && "Protocol qualifiers only exist in Objective-C");
|
||||
SourceLocation LAngleLoc, EndProtoLoc;
|
||||
llvm::SmallVector<Decl *, 8> ProtocolDecl;
|
||||
llvm::SmallVector<SourceLocation, 8> ProtocolLocs;
|
||||
ParseObjCProtocolReferences(ProtocolDecl, ProtocolLocs, false,
|
||||
LAngleLoc, EndProtoLoc);
|
||||
bool Result = ParseObjCProtocolReferences(ProtocolDecl, ProtocolLocs, false,
|
||||
LAngleLoc, EndProtoLoc);
|
||||
DS.setProtocolQualifiers(ProtocolDecl.data(), ProtocolDecl.size(),
|
||||
ProtocolLocs.data(), LAngleLoc);
|
||||
if (EndProtoLoc.isValid())
|
||||
DS.SetRangeEnd(EndProtoLoc);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// FIXME: We could do much better with this, if we recognized
|
||||
// placeholders somehow. However, we're content with not generating
|
||||
// bogus 'archaic' warnings with bad location info.
|
||||
@protocol <#protocol name#> <NSObject> // expected-error 2{{expected identifier}} \
|
||||
// expected-error{{cannot find protocol declaration for 'NSObject'}} \
|
||||
// expected-warning{{protocol qualifiers without 'id'}}
|
||||
|
||||
<#methods#> // expected-error{{expected identifier}}
|
||||
|
||||
@end // expected-error{{prefix attribute}}
|
Loading…
Reference in New Issue