I think I know what the issue is, preparing a fix.
> On Mar 16, 2017, at 4:38 PM, Yung, Douglas <douglas.y...@sony.com> wrote: > > [I can't find Nathan's email, so sending to the submitter, Argyrios] > > Hi Argyrios/Nathan, > > This change appears to be causing 9 tests on Windows to fail. It seems the > compiler crashes when trying to run the tests. Can you please take a look? > > The affected tests are the following: > > Clang :: ASTMerge/property/test.m > Clang :: Index/annotate-comments-objc.m > Clang :: Index/c-index-api-loadTU-test.m > Clang :: Index/index-pch-objc.m > Clang :: Modules/objc-categories.m > Clang :: PCH/chain-categories.m > Clang :: PCH/chain-categories2.m > Clang :: PCH/chain-class-extension.m > Clang :: PCH/objc_property.m > > Recent failure of the PS4 Windows bot: > http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/6902/steps/test/logs/stdio > >> -----Original Message----- >> From: cfe-commits [mailto:cfe-commits-boun...@lists.llvm.org] On Behalf Of >> Argyrios Kyrtzidis via cfe-commits >> Sent: Thursday, March 16, 2017 11:26 >> To: cfe-commits@lists.llvm.org >> Subject: r297972 - [index/AST] Add references for ObjC getter=/setter= >> property attributes and related property getter/setter role fixes >> >> Author: akirtzidis >> Date: Thu Mar 16 13:25:40 2017 >> New Revision: 297972 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=297972&view=rev >> Log: >> [index/AST] Add references for ObjC getter=/setter= property attributes and >> related property getter/setter role fixes >> >> This enhances the AST to keep track of locations of the names in those ObjC >> property attributes, and reports them for indexing. >> >> Patch by Nathan Hawes! >> https://reviews.llvm.org/D30907 >> >> Modified: >> cfe/trunk/include/clang/AST/DeclObjC.h >> cfe/trunk/include/clang/Sema/DeclSpec.h >> cfe/trunk/include/clang/Sema/Sema.h >> cfe/trunk/lib/AST/ASTImporter.cpp >> cfe/trunk/lib/Index/IndexBody.cpp >> cfe/trunk/lib/Index/IndexDecl.cpp >> cfe/trunk/lib/Parse/ParseObjc.cpp >> cfe/trunk/lib/Sema/SemaObjCProperty.cpp >> cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> cfe/trunk/lib/Serialization/ASTWriterDecl.cpp >> cfe/trunk/test/Index/Core/index-source.m >> >> Modified: cfe/trunk/include/clang/AST/DeclObjC.h >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=297972&r1=297971&r2=297972& >> view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/DeclObjC.h (original) >> +++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Mar 16 13:25:40 2017 >> @@ -743,6 +743,8 @@ private: >> >> Selector GetterName; // getter name of NULL if no getter >> Selector SetterName; // setter name of NULL if no setter >> + SourceLocation GetterNameLoc; // location of the getter attribute's >> + value SourceLocation SetterNameLoc; // location of the setter >> + attribute's value >> >> ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method >> ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method >> @@ -855,10 +857,18 @@ public: >> } >> >> Selector getGetterName() const { return GetterName; } >> - void setGetterName(Selector Sel) { GetterName = Sel; } >> + SourceLocation getGetterNameLoc() const { return GetterNameLoc; } >> + void setGetterName(Selector Sel, SourceLocation Loc) { >> + GetterName = Sel; >> + GetterNameLoc = Loc; >> + } >> >> Selector getSetterName() const { return SetterName; } >> - void setSetterName(Selector Sel) { SetterName = Sel; } >> + SourceLocation getSetterNameLoc() const { return SetterNameLoc; } >> + void setSetterName(Selector Sel, SourceLocation Loc) { >> + SetterName = Sel; >> + SetterNameLoc = Loc; >> + } >> >> ObjCMethodDecl *getGetterMethodDecl() const { return GetterMethodDecl; } >> void setGetterMethodDecl(ObjCMethodDecl *gDecl) { GetterMethodDecl = gDecl; >> } >> >> Modified: cfe/trunk/include/clang/Sema/DeclSpec.h >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/include/clang/Sema/DeclSpec.h?rev=297972&r1=297971&r2=297972 >> &view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Sema/DeclSpec.h (original) >> +++ cfe/trunk/include/clang/Sema/DeclSpec.h Thu Mar 16 13:25:40 2017 >> @@ -861,11 +861,19 @@ public: >> >> const IdentifierInfo *getGetterName() const { return GetterName; } >> IdentifierInfo *getGetterName() { return GetterName; } >> - void setGetterName(IdentifierInfo *name) { GetterName = name; } >> + SourceLocation getGetterNameLoc() const { return GetterNameLoc; } >> + void setGetterName(IdentifierInfo *name, SourceLocation loc) { >> + GetterName = name; >> + GetterNameLoc = loc; >> + } >> >> const IdentifierInfo *getSetterName() const { return SetterName; } >> IdentifierInfo *getSetterName() { return SetterName; } >> - void setSetterName(IdentifierInfo *name) { SetterName = name; } >> + SourceLocation getSetterNameLoc() const { return SetterNameLoc; } >> + void setSetterName(IdentifierInfo *name, SourceLocation loc) { >> + SetterName = name; >> + SetterNameLoc = loc; >> + } >> >> private: >> // FIXME: These two are unrelated and mutually exclusive. So perhaps @@ - >> 882,6 +890,9 @@ private: >> >> IdentifierInfo *GetterName; // getter name or NULL if no getter >> IdentifierInfo *SetterName; // setter name or NULL if no setter >> + SourceLocation GetterNameLoc; // location of the getter attribute's >> + value SourceLocation SetterNameLoc; // location of the setter >> + attribute's value >> + >> }; >> >> /// \brief Represents a C++ unqualified-id that has been parsed. >> >> Modified: cfe/trunk/include/clang/Sema/Sema.h >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/include/clang/Sema/Sema.h?rev=297972&r1=297971&r2=297972&vie >> w=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Sema/Sema.h (original) >> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 16 13:25:40 2017 >> @@ -3266,7 +3266,9 @@ public: >> SourceLocation LParenLoc, >> FieldDeclarator &FD, >> Selector GetterSel, >> + SourceLocation GetterNameLoc, >> Selector SetterSel, >> + SourceLocation SetterNameLoc, >> const bool isReadWrite, >> unsigned &Attributes, >> const unsigned AttributesAsWritten, @@ -3282,7 +3284,9 >> @@ public: >> SourceLocation LParenLoc, >> FieldDeclarator &FD, >> Selector GetterSel, >> + SourceLocation GetterNameLoc, >> Selector SetterSel, >> + SourceLocation SetterNameLoc, >> const bool isReadWrite, >> const unsigned Attributes, >> const unsigned AttributesAsWritten, >> >> Modified: cfe/trunk/lib/AST/ASTImporter.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=297972&r1=297971&r2=297972&view= >> diff >> ============================================================================== >> --- cfe/trunk/lib/AST/ASTImporter.cpp (original) >> +++ cfe/trunk/lib/AST/ASTImporter.cpp Thu Mar 16 13:25:40 2017 >> @@ -4580,8 +4580,10 @@ Decl *ASTNodeImporter::VisitObjCProperty >> ToProperty->setPropertyAttributes(D->getPropertyAttributes()); >> ToProperty->setPropertyAttributesAsWritten( >> D->getPropertyAttributesAsWritten()); >> - ToProperty->setGetterName(Importer.Import(D->getGetterName())); >> - ToProperty->setSetterName(Importer.Import(D->getSetterName())); >> + ToProperty->setGetterName(Importer.Import(D->getGetterName()), >> + Importer.Import(D->getGetterNameLoc())); >> + ToProperty->setSetterName(Importer.Import(D->getSetterName()), >> + Importer.Import(D->getSetterNameLoc())); >> ToProperty->setGetterMethodDecl( >> cast_or_null<ObjCMethodDecl>(Importer.Import(D- >>> getGetterMethodDecl()))); >> ToProperty->setSetterMethodDecl( >> >> Modified: cfe/trunk/lib/Index/IndexBody.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Index/IndexBody.cpp?rev=297972&r1=297971&r2=297972&view= >> diff >> ============================================================================== >> --- cfe/trunk/lib/Index/IndexBody.cpp (original) >> +++ cfe/trunk/lib/Index/IndexBody.cpp Thu Mar 16 13:25:40 2017 >> @@ -22,6 +22,10 @@ class BodyIndexer : public RecursiveASTV >> SmallVector<Stmt*, 16> StmtStack; >> >> typedef RecursiveASTVisitor<BodyIndexer> base; >> + >> + Stmt *getParentStmt() const { >> + return StmtStack.size() < 2 ? nullptr : StmtStack.end()[-2]; } >> public: >> BodyIndexer(IndexingContext &indexCtx, >> const NamedDecl *Parent, const DeclContext *DC) @@ -178,7 >> +182,8 @@ public: >> SymbolRoleSet Roles{}; >> SmallVector<SymbolRelation, 2> Relations; >> addCallRole(Roles, Relations); >> - if (E->isImplicit()) >> + Stmt *Containing = getParentStmt(); >> + if (E->isImplicit() || (Containing && >> + isa<PseudoObjectExpr>(Containing))) >> Roles |= (unsigned)SymbolRole::Implicit; >> >> if (isDynamic(E)) { >> @@ -194,9 +199,12 @@ public: >> } >> >> bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { >> - if (E->isExplicitProperty()) >> + if (E->isExplicitProperty()) { >> + SmallVector<SymbolRelation, 2> Relations; >> + SymbolRoleSet Roles = getRolesForRef(E, Relations); >> return IndexCtx.handleReference(E->getExplicitProperty(), E- >>> getLocation(), >> - Parent, ParentDC, SymbolRoleSet(), {}, >> E); >> + Parent, ParentDC, Roles, Relations, >> E); >> + } >> >> // No need to do a handleReference for the objc method, because there >> will >> // be a message expr as part of PseudoObjectExpr. >> >> Modified: cfe/trunk/lib/Index/IndexDecl.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Index/IndexDecl.cpp?rev=297972&r1=297971&r2=297972&view= >> diff >> ============================================================================== >> --- cfe/trunk/lib/Index/IndexDecl.cpp (original) >> +++ cfe/trunk/lib/Index/IndexDecl.cpp Thu Mar 16 13:25:40 2017 >> @@ -98,9 +98,28 @@ public: >> if (MethodLoc.isInvalid()) >> MethodLoc = D->getLocation(); >> >> + SourceLocation AttrLoc; >> + >> + // check for (getter=/setter=) >> + if (AssociatedProp) { >> + bool isGetter = !D->param_size(); >> + AttrLoc = isGetter ? >> + AssociatedProp->getGetterNameLoc(): >> + AssociatedProp->getSetterNameLoc(); >> + } >> + >> SymbolRoleSet Roles = (SymbolRoleSet)SymbolRole::Dynamic; >> - if (D->isImplicit()) >> - Roles |= (SymbolRoleSet)SymbolRole::Implicit; >> + if (D->isImplicit()) { >> + if (AttrLoc.isValid()) { >> + MethodLoc = AttrLoc; >> + } else { >> + Roles |= (SymbolRoleSet)SymbolRole::Implicit; >> + } >> + } else if (AttrLoc.isValid()) { >> + IndexCtx.handleReference(D, AttrLoc, cast<NamedDecl>(D- >>> getDeclContext()), >> + D->getDeclContext(), 0); >> + } >> + >> if (!IndexCtx.handleDecl(D, MethodLoc, Roles, Relations)) >> return false; >> IndexCtx.indexTypeSourceInfo(D->getReturnTypeSourceInfo(), D); >> >> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=297972&r1=297971&r2=297972&view= >> diff >> ============================================================================== >> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original) >> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Thu Mar 16 13:25:40 2017 >> @@ -929,7 +929,7 @@ void Parser::ParseObjCPropertyAttribute( >> >> if (IsSetter) { >> DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_setter); >> - DS.setSetterName(SelIdent); >> + DS.setSetterName(SelIdent, SelLoc); >> >> if (ExpectAndConsume(tok::colon, >> diag::err_expected_colon_after_setter_name)) { >> @@ -938,7 +938,7 @@ void Parser::ParseObjCPropertyAttribute( >> } >> } else { >> DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_getter); >> - DS.setGetterName(SelIdent); >> + DS.setGetterName(SelIdent, SelLoc); >> } >> } else if (II->isStr("nonnull")) { >> if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability) >> >> Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=297972&r1=297971&r2=297972 >> &view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Thu Mar 16 13:25:40 2017 >> @@ -200,9 +200,10 @@ Decl *Sema::ActOnProperty(Scope *S, Sour >> if (ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(ClassDecl)) { >> if (CDecl->IsClassExtension()) { >> Res = HandlePropertyInClassExtension(S, AtLoc, LParenLoc, >> - FD, GetterSel, SetterSel, >> - isReadWrite, >> - Attributes, >> + FD, >> + GetterSel, >> ODS.getGetterNameLoc(), >> + SetterSel, >> ODS.getSetterNameLoc(), >> + isReadWrite, Attributes, >> ODS.getPropertyAttributes(), >> T, TSI, MethodImplKind); >> if (!Res) >> @@ -212,9 +213,10 @@ Decl *Sema::ActOnProperty(Scope *S, Sour >> >> if (!Res) { >> Res = CreatePropertyDecl(S, ClassDecl, AtLoc, LParenLoc, FD, >> - GetterSel, SetterSel, isReadWrite, >> - Attributes, ODS.getPropertyAttributes(), >> - T, TSI, MethodImplKind); >> + GetterSel, ODS.getGetterNameLoc(), SetterSel, >> + ODS.getSetterNameLoc(), isReadWrite, >> Attributes, >> + ODS.getPropertyAttributes(), T, TSI, >> + MethodImplKind); >> if (lexicalDC) >> Res->setLexicalDeclContext(lexicalDC); >> } >> @@ -412,7 +414,10 @@ Sema::HandlePropertyInClassExtension(Sco >> SourceLocation AtLoc, >> SourceLocation LParenLoc, >> FieldDeclarator &FD, >> - Selector GetterSel, Selector SetterSel, >> + Selector GetterSel, >> + SourceLocation GetterNameLoc, >> + Selector SetterSel, >> + SourceLocation SetterNameLoc, >> const bool isReadWrite, >> unsigned &Attributes, >> const unsigned AttributesAsWritten, @@ - >> 512,7 +517,8 @@ Sema::HandlePropertyInClassExtension(Sco >> // Create a new ObjCPropertyDecl with the DeclContext being >> // the class extension. >> ObjCPropertyDecl *PDecl = CreatePropertyDecl(S, CDecl, AtLoc, LParenLoc, >> - FD, GetterSel, SetterSel, >> + FD, GetterSel, GetterNameLoc, >> + SetterSel, >> + SetterNameLoc, >> isReadWrite, >> Attributes, >> AttributesAsWritten, >> T, TSI, MethodImplKind, DC); >> @@ -562,7 +568,9 @@ ObjCPropertyDecl *Sema::CreatePropertyDe >> SourceLocation LParenLoc, >> FieldDeclarator &FD, >> Selector GetterSel, >> + SourceLocation >> + GetterNameLoc, >> Selector SetterSel, >> + SourceLocation >> + SetterNameLoc, >> const bool isReadWrite, >> const unsigned Attributes, >> const unsigned >> AttributesAsWritten, @@ -640,8 +648,8 @@ ObjCPropertyDecl >> *Sema::CreatePropertyDe >> >> // Regardless of setter/getter attribute, we save the default getter/setter >> // selector names in anticipation of declaration of setter/getter methods. >> - PDecl->setGetterName(GetterSel); >> - PDecl->setSetterName(SetterSel); >> + PDecl->setGetterName(GetterSel, GetterNameLoc); >> + PDecl->setSetterName(SetterSel, SetterNameLoc); >> PDecl->setPropertyAttributesAsWritten( >> >> makePropertyAttributesAsWritten(AttributesAsWritten)); >> >> >> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=297972&r1=297971&r2= >> 297972&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Mar 16 13:25:40 >> +++ 2017 >> @@ -1124,8 +1124,10 @@ void ASTDeclReader::VisitObjCPropertyDec >> (ObjCPropertyDecl::PropertyAttributeKind)Record.readInt()); >> D->setPropertyImplementation( >> (ObjCPropertyDecl::PropertyControl)Record.readInt()); >> - D->setGetterName(Record.readDeclarationName().getObjCSelector()); >> - D->setSetterName(Record.readDeclarationName().getObjCSelector()); >> + D->setGetterName(Record.readDeclarationName().getObjCSelector(), >> + ReadSourceLocation()); >> + D->setSetterName(Record.readDeclarationName().getObjCSelector(), >> + ReadSourceLocation()); >> D->setGetterMethodDecl(ReadDeclAs<ObjCMethodDecl>()); >> D->setSetterMethodDecl(ReadDeclAs<ObjCMethodDecl>()); >> D->setPropertyIvarDecl(ReadDeclAs<ObjCIvarDecl>()); >> >> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp >> URL: http://llvm.org/viewvc/llvm- >> project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=297972&r1=297971&r2= >> 297972&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Thu Mar 16 13:25:40 >> +++ 2017 >> @@ -799,7 +799,9 @@ void ASTDeclWriter::VisitObjCPropertyDec >> // FIXME: stable encoding >> Record.push_back((unsigned)D->getPropertyImplementation()); >> Record.AddDeclarationName(D->getGetterName()); >> + Record.AddSourceLocation(D->getGetterNameLoc()); >> Record.AddDeclarationName(D->getSetterName()); >> + Record.AddSourceLocation(D->getSetterNameLoc()); >> Record.AddDeclRef(D->getGetterMethodDecl()); >> Record.AddDeclRef(D->getSetterMethodDecl()); >> Record.AddDeclRef(D->getPropertyIvarDecl()); >> >> Modified: cfe/trunk/test/Index/Core/index-source.m >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index- >> source.m?rev=297972&r1=297971&r2=297972&view=diff >> ============================================================================== >> --- cfe/trunk/test/Index/Core/index-source.m (original) >> +++ cfe/trunk/test/Index/Core/index-source.m Thu Mar 16 13:25:40 2017 >> @@ -121,39 +121,79 @@ extern int setjmp(jmp_buf); @end >> >> @interface I2 >> +// CHECK: [[@LINE-1]]:12 | class/ObjC | I2 | [[I2_USR:.*]] | {{.*}} | >> +Decl | rel: 0 >> + >> @property (readwrite) id prop; >> +// CHECK: [[@LINE-1]]:26 | instance-method/acc-get/ObjC | prop | >> +[[I2_prop_getter_USR:.*]] | -[I2 prop] | Decl,Dyn,Impl,RelChild,RelAcc >> +| rel: 2 // CHECK: [[@LINE-2]]:26 | instance-method/acc-set/ObjC | >> +setProp: | [[I2_prop_setter_USR:.*]] | -[I2 setProp:] | >> +Decl,Dyn,Impl,RelChild,RelAcc | rel: 2 // CHECK: [[@LINE-3]]:26 | >> +instance-property/ObjC | prop | [[I2_prop_USR:.*]] | <no-cgname> | >> +Decl,RelChild | rel: 1 >> + >> +@property (readwrite, getter=customGet, setter=customSet:) id >> +unrelated; // CHECK: [[@LINE-1]]:30 | instance-method/acc-get/ObjC | >> +customGet | {{.*}} | -[I2 customGet] | Decl,Dyn,RelChild,RelAcc | rel: >> +2 // CHECK: [[@LINE-2]]:48 | instance-method/acc-set/ObjC | customSet: >> +| {{.*}} | -[I2 customSet:] | Decl,Dyn,RelChild,RelAcc | rel: 2 // >> +CHECK: [[@LINE-3]]:63 | instance-property/ObjC | unrelated | {{.*}} | >> +<no-cgname> | Decl,RelChild | rel: 1 >> + >> +-(id)declaredGet; >> +@property (readwrite, getter=declaredGet) id otherProp; // CHECK: >> +[[@LINE-1]]:30 | instance-method/acc-get/ObjC | declaredGet | {{.*}} | >> +-[I2 declaredGet] | Ref,RelCont | rel: 1 // CHECK: [[@LINE-3]]:6 | >> +instance-method/acc-get/ObjC | declaredGet | {{.*}} | -[I2 declaredGet] >> +| Decl,Dyn,RelChild,RelAcc | rel: 2 // CHECK: [[@LINE-3]]:46 | >> +instance-method/acc-set/ObjC | setOtherProp: | {{.*}} | -[I2 >> +setOtherProp:] | Decl,Dyn,Impl,RelChild,RelAcc | rel: 2 >> >> -// CHECK: [[@LINE+4]]:63 | instance-property(IB,IBColl)/ObjC | buttons | >> c:objc(cs)I2(py)buttons | <no-cgname> | Decl,RelChild | rel: 1 -// >> CHECK-NEXT: >> RelChild | I2 | c:objc(cs)I2 >> +// CHECK: [[@LINE+4]]:63 | instance-property(IB,IBColl)/ObjC | buttons >> +| [[buttons_USR:.*]] | <no-cgname> | Decl,RelChild | rel: 1 // >> +CHECK-NEXT: RelChild | I2 | [[I2_USR]] >> // CHECK: [[@LINE+2]]:50 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 >> | Ref,RelCont,RelIBType | rel: 1 -// CHECK-NEXT: RelCont,RelIBType | buttons >> | >> c:objc(cs)I2(py)buttons >> +// CHECK-NEXT: RelCont,RelIBType | buttons | [[buttons_USR]] >> @property (nonatomic, strong) IBOutletCollection(I1) NSArray *buttons; @end >> >> @implementation I2 >> -// CHECK: [[@LINE+9]]:13 | instance-property/ObjC | prop | >> c:objc(cs)I2(py)prop | <no-cgname> | Def,RelChild,RelAcc | rel: 2 -// CHECK- >> NEXT: RelChild | I2 | c:objc(cs)I2 >> +// CHECK: [[@LINE+9]]:13 | instance-property/ObjC | prop | >> +[[I2_prop_USR:.*]] | <no-cgname> | Def,RelChild,RelAcc | rel: 2 // >> +CHECK-NEXT: RelChild | I2 | [[I2_USR]] >> // CHECK-NEXT: RelAcc | _prop | c:objc(cs)I2@_prop -// CHECK: [[@LINE+6]]:13 >> | instance-method/acc-get/ObjC | prop | c:objc(cs)I2(im)prop | -[I2 prop] | >> Def,Impl,RelChild | rel: 1 -// CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 -// >> CHECK: [[@LINE+4]]:13 | instance-method/acc-set/ObjC | setProp: | >> c:objc(cs)I2(im)setProp: | -[I2 setProp:] | Def,Impl,RelChild | rel: 1 -// >> CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 >> +// CHECK: [[@LINE+6]]:13 | instance-method/acc-get/ObjC | prop | >> +[[I2_prop_getter_USR]] | -[I2 prop] | Def,Impl,RelChild | rel: 1 // >> +CHECK-NEXT: RelChild | I2 | [[I2_USR]] // CHECK: [[@LINE+4]]:13 | >> +instance-method/acc-set/ObjC | setProp: | [[I2_prop_setter_USR]] | -[I2 >> +setProp:] | Def,Impl,RelChild | rel: 1 // CHECK-NEXT: RelChild | I2 | >> +[[I2_USR]] >> // CHECK: [[@LINE+2]]:20 | field/ObjC | _prop | c:objc(cs)I2@_prop | <no- >> cgname> | Def,RelChild | rel: 1 -// CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 >> +// CHECK-NEXT: RelChild | I2 | [[I2_USR]] >> @synthesize prop = _prop; >> >> -// CHECK: [[@LINE+11]]:12 | instance-method(IB)/ObjC | doAction:foo: | >> c:objc(cs)I2(im)doAction:foo: | -[I2 doAction:foo:] | Def,Dyn,RelChild | rel: >> 1 -// CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 >> +// CHECK: [[@LINE+11]]:12 | instance-method(IB)/ObjC | doAction:foo: | >> +[[doAction_USR:.*]] | -[I2 doAction:foo:] | Def,Dyn,RelChild | rel: 1 >> +// CHECK-NEXT: RelChild | I2 | [[I2_USR]] >> // CHECK: [[@LINE+9]]:22 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 >> | Ref,RelCont,RelIBType | rel: 1 -// CHECK-NEXT: RelCont,RelIBType | >> doAction:foo: | c:objc(cs)I2(im)doAction:foo: >> +// CHECK-NEXT: RelCont,RelIBType | doAction:foo: | [[doAction_USR]] >> // CHECK-NOT: [[@LINE+7]]:27 | param >> // LOCAL: [[@LINE+6]]:27 | param(local)/C | sender | c:{{.*}} | _sender | >> Def,RelChild | rel: 1 -// LOCAL-NEXT: RelChild | doAction:foo: | >> c:objc(cs)I2(im)doAction:foo: >> +// LOCAL-NEXT: RelChild | doAction:foo: | [[doAction_USR:.*]] >> // CHECK: [[@LINE+4]]:39 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 >> | Ref,RelCont | rel: 1 // CHECK-NOT: [[@LINE+3]]:44 | param // LOCAL: >> [[@LINE+2]]:44 | param(local)/C | bar | c:{{.*}} | _bar | Def,RelChild | rel: >> 1 -// LOCAL-NEXT: RelChild | doAction:foo: | c:objc(cs)I2(im)doAction:foo: >> --(IBAction)doAction:(I1 *)sender foo:(I1 *)bar {} >> +// LOCAL-NEXT: RelChild | doAction:foo: | [[doAction_USR]] >> +-(IBAction)doAction:(I1 *)sender foo:(I1 *)bar { >> + [self prop]; >> + // CHECK: [[@LINE-1]]:9 | instance-method/acc-get/ObjC | prop | >> +[[I2_prop_getter_USR]] | -[I2 prop] | >> +Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2 >> + // CHECK-NEXT: RelCall,RelCont | doAction:foo: | [[doAction_USR]] >> + // CHECK-NEXT: RelRec | I2 | [[I2_USR]] >> + >> + [self setProp: bar]; >> + // CHECK: [[@LINE-1]]:9 | instance-method/acc-set/ObjC | setProp: | >> + [[I2_prop_setter_USR]] | -[I2 setProp:] | >> + Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2 // CHECK-NEXT: >> + RelCall,RelCont | doAction:foo: | [[doAction_USR]] // CHECK-NEXT: >> + RelRec | I2 | [[I2_USR]] >> + >> + self.prop; >> + // CHECK: [[@LINE-1]]:8 | instance-property/ObjC | prop | >> + [[I2_prop_USR]] | <no-cgname> | Ref,RelCont | rel: 1 // CHECK-NEXT: >> + RelCont | doAction:foo: | [[doAction_USR]] // CHECK: [[@LINE-3]]:8 | >> + instance-method/acc-get/ObjC | prop | [[I2_prop_getter_USR]] | -[I2 >> + prop] | Ref,Call,Dyn,Impl,RelRec,RelCall,RelCont | rel: 2 // >> + CHECK-NEXT: RelCall,RelCont | doAction:foo: | [[doAction_USR]] // >> + CHECK-NEXT: RelRec | I2 | [[I2_USR]] >> + >> + self.prop = self.prop; >> + // CHECK: [[@LINE-1]]:8 | instance-property/ObjC | prop | >> +[[I2_prop_USR]] | <no-cgname> | Ref,Writ,RelCont | rel: 1 >> + // CHECK-NEXT: RelCont | doAction:foo: | [[doAction_USR]] >> + // CHECK:[[@LINE-3]]:8 | instance-method/acc-set/ObjC | setProp: | >> +[[I2_prop_setter_USR]] | -[I2 setProp:] | >> +Ref,Call,Dyn,Impl,RelRec,RelCall,RelCont | rel: 2 >> + // CHECK-NEXT: RelCall,RelCont | doAction:foo: | [[doAction_USR]] >> + // CHECK-NEXT: RelRec | I2 | [[I2_USR]] } >> @end >> >> @interface I3 >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits