r297972 - [index/AST] Add references for ObjC getter=/setter= property attributes and related property getter/setter role fixes

Yung, Douglas via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 16 16:38:06 PDT 2017


[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