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-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