зеркало из https://github.com/microsoft/clang.git
Implemented parsing of objctive-c protocol conforming type used in
an identifier statement. Fixed up pretty priting to print this type correctly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42866 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
88e0052dd8
Коммит
dfbcce2b55
12
AST/Type.cpp
12
AST/Type.cpp
|
@ -858,14 +858,18 @@ void ObjcInterfaceType::getAsStringInternal(std::string &InnerString) const {
|
|||
|
||||
void ObjcQualifiedInterfaceType::getAsStringInternal(
|
||||
std::string &InnerString) const {
|
||||
InnerString = getInterfaceType()->getDecl()->getName() + '<';
|
||||
if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
|
||||
InnerString = ' ' + InnerString;
|
||||
std::string ObjcQIString = getInterfaceType()->getDecl()->getName();
|
||||
ObjcQIString += '<';
|
||||
int num = getNumProtocols();
|
||||
for (int i = 0; i < num; i++) {
|
||||
InnerString += getProtocols(i)->getName();
|
||||
ObjcQIString += getProtocols(i)->getName();
|
||||
if (i < num-1)
|
||||
InnerString += ',';
|
||||
ObjcQIString += ',';
|
||||
}
|
||||
InnerString += '>';
|
||||
ObjcQIString += '>';
|
||||
InnerString = ObjcQIString + InnerString;
|
||||
}
|
||||
|
||||
void TagType::getAsStringInternal(std::string &InnerString) const {
|
||||
|
|
|
@ -235,6 +235,16 @@ Parser::StmtResult Parser::ParseIdentifierStatement(bool OnlyStatement) {
|
|||
IdentTok.getLocation(), PrevSpec,
|
||||
TypeRep);
|
||||
assert(!isInvalid && "First declspec can't be invalid!");
|
||||
if (Tok.is(tok::less)) {
|
||||
llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
|
||||
ParseObjCProtocolReferences(ProtocolRefs);
|
||||
llvm::SmallVector<DeclTy *, 8> *ProtocolDecl =
|
||||
new llvm::SmallVector<DeclTy *, 8>;
|
||||
DS.setProtocolQualifiers(ProtocolDecl);
|
||||
Actions.FindProtocolDeclaration(IdentTok.getLocation(),
|
||||
&ProtocolRefs[0], ProtocolRefs.size(),
|
||||
*ProtocolDecl);
|
||||
}
|
||||
|
||||
// ParseDeclarationSpecifiers will continue from there.
|
||||
ParseDeclarationSpecifiers(DS);
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: clang -ast-print %s
|
||||
|
||||
@protocol P1 @end
|
||||
@protocol P2 @end
|
||||
@protocol P3 @end
|
||||
|
||||
@interface INTF
|
||||
- (INTF<P1>*) METH;
|
||||
@end
|
||||
|
||||
void foo()
|
||||
{
|
||||
INTF *pintf;
|
||||
INTF<P1>* p1;
|
||||
INTF<P1, P1>* p2;
|
||||
INTF<P1, P3>* p3;
|
||||
INTF<P1, P3, P2>* p4;
|
||||
INTF<P2,P2, P3, P1>* p5;
|
||||
}
|
Загрузка…
Ссылка в новой задаче