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 18:02:40 PDT 2017


I have high hopes r298027 will fix this.

> On Mar 16, 2017, at 5:42 PM, Argyrios Kyrtzidis <akyrtzi at 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.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