Your change does seem to have done the trick. Thanks! Douglas Yung
> -----Original Message----- > From: Argyrios Kyrtzidis [mailto:akyr...@gmail.com] > Sent: Thursday, March 16, 2017 18:03 > To: Yung, Douglas > Cc: cfe-commits > Subject: Re: r297972 - [index/AST] Add references for ObjC getter=/setter= > property attributes and related property getter/setter role fixes > > I have high hopes r298027 will fix this. > > > On Mar 16, 2017, at 5:42 PM, Argyrios Kyrtzidis <akyr...@gmail.com> wrote: > > > > 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-wind > >> ows10pro-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=29 > >>> 7972&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=29 > >>> 7972&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=29 > >>> 7972&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=29 > >>> 7972&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 | > >>> cgname> | 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