r297972 - [index/AST] Add references for ObjC getter=/setter= property attributes and related property getter/setter role fixes
Argyrios Kyrtzidis via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 16 17:42:21 PDT 2017
I think I know what the issue is, preparing a fix.
> On Mar 16, 2017, at 4:38 PM, Yung, Douglas <douglas.yung at 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-bounces at lists.llvm.org] On Behalf Of
>> Argyrios Kyrtzidis via cfe-commits
>> Sent: Thursday, March 16, 2017 11:26
>> To: cfe-commits at 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
>> +
>> + at 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;
>> + at 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 at _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 at _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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list