[cfe-commits] r138709 - in /cfe/trunk: include/clang/AST/ include/clang/Parse/ include/clang/Sema/ lib/AST/ lib/Frontend/ lib/Parse/ lib/Rewrite/ lib/Sema/ lib/Serialization/ test/Rewriter/ tools/libclang/

Andrew Trick atrick at apple.com
Mon Aug 29 10:41:49 PDT 2011


Fariborz,

Is this commit causing the rewriter failures?

http://smooshlab.apple.com:8013/builders/rewriter_i386-pc-win32/builds/2246

    C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(39475): error C2018: unknown character '0x40'
    C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(39475): error C2371: 'Protocol' : redefinition; different basic types
            C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(4) : see declaration of 'Protocol'
    C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(39519): error C2556: 'Protocol *objc_getProtocol(const char *)' : overloaded function differs only by return type from 'Protocol *objc_getProtocol(const char *)'
            C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(24) : see declaration of 'objc_getProtocol'
    C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(39519): error C2371: 'objc_getProtocol' : redefinition; different basic types
            C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp(24) : see declaration of 'objc_getProtocol'
    C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.src\CoreFoundation.proj(249,5): error MSB3073: The command "cl /nologo /TP /Fd"C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\\" /c /MD /O1 /Zi /MP2 /DYNAMICBASE /GS /D__inline__=inline /Dnil=0 /DCF_EXPORT_CONSTANT_STRING /D__OBJC_EXPORT_BLOCKS /D__block= /D__BLOCKS__ /DXXX_Complex=_Complex  C:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.cpp /FoC:\public\zorg\buildbot\smooshlab\slave\build.rewriter_i386-pc-win32\CoreFoundation.obj\CoreFoundation.build\Release\CFNotificationCenter.obj" exited with code 2.

-Andy
On Aug 27, 2011, at 1:51 PM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Sat Aug 27 15:50:59 2011
> New Revision: 138709
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=138709&view=rev
> Log:
> objective-c: Treat top-level objective-c declarations
> , such as list of forward @class decls, in a DeclGroup
> node. Deal with its consequence throught clang. This
> is in preparation for more Sema work ahead. // rdar://8843851.
> Feel free to reverse if it breaks something important
> and I am unavailable.
> 
> Modified:
>    cfe/trunk/include/clang/AST/DeclObjC.h
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/include/clang/Sema/Sema.h
>    cfe/trunk/lib/AST/ASTImporter.cpp
>    cfe/trunk/lib/AST/DeclBase.cpp
>    cfe/trunk/lib/AST/DeclObjC.cpp
>    cfe/trunk/lib/AST/DeclPrinter.cpp
>    cfe/trunk/lib/AST/DumpXML.cpp
>    cfe/trunk/lib/Frontend/ASTUnit.cpp
>    cfe/trunk/lib/Parse/ParseObjc.cpp
>    cfe/trunk/lib/Parse/Parser.cpp
>    cfe/trunk/lib/Rewrite/RewriteObjC.cpp
>    cfe/trunk/lib/Sema/SemaCodeComplete.cpp
>    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
>    cfe/trunk/lib/Sema/SemaLookup.cpp
>    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>    cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
>    cfe/trunk/test/Rewriter/rewrite-forward-class.m
>    cfe/trunk/tools/libclang/CIndex.cpp
> 
> Modified: cfe/trunk/include/clang/AST/DeclObjC.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclObjC.h (original)
> +++ cfe/trunk/include/clang/AST/DeclObjC.h Sat Aug 27 15:50:59 2011
> @@ -918,29 +918,23 @@
>     ObjCInterfaceDecl *getInterface() const { return ID; }
>   };
> private:
> -  ObjCClassRef *ForwardDecls;
> -  unsigned NumDecls;
> +  ObjCClassRef *ForwardDecl;
> 
>   ObjCClassDecl(DeclContext *DC, SourceLocation L,
> -                ObjCInterfaceDecl *const *Elts, const SourceLocation *Locs,                
> -                unsigned nElts, ASTContext &C);
> +                ObjCInterfaceDecl *const Elt, const SourceLocation Loc,                
> +                ASTContext &C);
> public:
>   static ObjCClassDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L,
> -                               ObjCInterfaceDecl *const *Elts = 0,
> -                               const SourceLocation *Locs = 0,
> -                               unsigned nElts = 0);
> +                               ObjCInterfaceDecl *const Elt = 0,
> +                               const SourceLocation Locs = SourceLocation());
> +    
> +  ObjCInterfaceDecl *getForwardInterfaceDecl() { return ForwardDecl->getInterface(); }
> +  ObjCClassRef *getForwardDecl() { return ForwardDecl; }
> +  void setClass(ASTContext &C, ObjCInterfaceDecl*const Cls,
> +                const SourceLocation Locs);
> 
>   virtual SourceRange getSourceRange() const;
> 
> -  typedef const ObjCClassRef* iterator;
> -  iterator begin() const { return ForwardDecls; }
> -  iterator end() const { return ForwardDecls + NumDecls; }
> -  unsigned size() const { return NumDecls; }
> -
> -  /// setClassList - Set the list of forward classes.
> -  void setClassList(ASTContext &C, ObjCInterfaceDecl*const*List,
> -                    const SourceLocation *Locs, unsigned Num);
> -
>   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
>   static bool classof(const ObjCClassDecl *D) { return true; }
>   static bool classofKind(Kind K) { return K == ObjCClass; }
> 
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Sat Aug 27 15:50:59 2011
> @@ -1060,8 +1060,8 @@
>   ExprResult ParseAsmStringLiteral();
> 
>   // Objective-C External Declarations
> -  Decl *ParseObjCAtDirectives();
> -  Decl *ParseObjCAtClassDeclaration(SourceLocation atLoc);
> +  Parser::DeclGroupPtrTy ParseObjCAtDirectives();
> +  Parser::DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc);
>   Decl *ParseObjCAtInterfaceDeclaration(SourceLocation atLoc,
>                                         ParsedAttributes &prefixAttrs);
>   void ParseObjCClassInstanceVariables(Decl *interfaceDecl,
> 
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Sat Aug 27 15:50:59 2011
> @@ -5010,7 +5010,7 @@
>                                          IdentifierInfo *CatName,
>                                          SourceLocation CatLoc);
> 
> -  Decl *ActOnForwardClassDeclaration(SourceLocation Loc,
> +  DeclGroupPtrTy ActOnForwardClassDeclaration(SourceLocation Loc,
>                                      IdentifierInfo **IdentList,
>                                      SourceLocation *IdentLocs,
>                                      unsigned NumElts);
> 
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Sat Aug 27 15:50:59 2011
> @@ -3529,25 +3529,14 @@
> 
>   // Import the location of this declaration.
>   SourceLocation Loc = Importer.Import(D->getLocation());
> -
> -  SmallVector<ObjCInterfaceDecl *, 4> Interfaces;
> -  SmallVector<SourceLocation, 4> Locations;
> -  for (ObjCClassDecl::iterator From = D->begin(), FromEnd = D->end();
> -       From != FromEnd; ++From) {
> -    ObjCInterfaceDecl *ToIface
> -      = cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface()));
> -    if (!ToIface)
> -      continue;
> -    
> -    Interfaces.push_back(ToIface);
> -    Locations.push_back(Importer.Import(From->getLocation()));
> -  }
> -  
> +  ObjCClassDecl::ObjCClassRef *From = D->getForwardDecl();
> +  ObjCInterfaceDecl *ToIface
> +    = cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface()));
>   ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC,
> -                                                 Loc, 
> -                                                 Interfaces.data(),
> -                                                 Locations.data(),
> -                                                 Interfaces.size());
> +                                        Loc,
> +                                        ToIface,
> +                                        Importer.Import(From->getLocation()));
> +    
>   ToClass->setLexicalDeclContext(LexicalDC);
>   LexicalDC->addDecl(ToClass);
>   Importer.Imported(D, ToClass);
> 
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Sat Aug 27 15:50:59 2011
> @@ -1030,12 +1030,10 @@
>         if (D->getDeclContext() == DCtx)
>           makeDeclVisibleInContextImpl(ND);
> 
> -      // Insert any forward-declared Objective-C interfaces into the lookup
> +      // Insert any forward-declared Objective-C interface into the lookup
>       // data structure.
>       if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(*D))
> -        for (ObjCClassDecl::iterator I = Class->begin(), IEnd = Class->end();
> -             I != IEnd; ++I)
> -          makeDeclVisibleInContextImpl(I->getInterface());
> +        makeDeclVisibleInContextImpl(Class->getForwardInterfaceDecl());
> 
>       // If this declaration is itself a transparent declaration context or
>       // inline namespace, add its members (recursively).
> 
> Modified: cfe/trunk/lib/AST/DeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclObjC.cpp (original)
> +++ cfe/trunk/lib/AST/DeclObjC.cpp Sat Aug 27 15:50:59 2011
> @@ -851,36 +851,31 @@
> //===----------------------------------------------------------------------===//
> 
> ObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L,
> -                             ObjCInterfaceDecl *const *Elts,
> -                             const SourceLocation *Locs,
> -                             unsigned nElts,
> +                             ObjCInterfaceDecl *const Elt,
> +                             const SourceLocation Loc,
>                              ASTContext &C)
>   : Decl(ObjCClass, DC, L) {
> -  setClassList(C, Elts, Locs, nElts);
> -}
> -
> -void ObjCClassDecl::setClassList(ASTContext &C, ObjCInterfaceDecl*const*List,
> -                                 const SourceLocation *Locs, unsigned Num) {
> -  ForwardDecls = (ObjCClassRef*) C.Allocate(sizeof(ObjCClassRef)*Num,
> -                                            llvm::alignOf<ObjCClassRef>());
> -  for (unsigned i = 0; i < Num; ++i)
> -    new (&ForwardDecls[i]) ObjCClassRef(List[i], Locs[i]);
> -  
> -  NumDecls = Num;
> +  setClass(C, Elt, Loc);
> }
> 
> ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
>                                      SourceLocation L,
> -                                     ObjCInterfaceDecl *const *Elts,
> -                                     const SourceLocation *Locs,
> -                                     unsigned nElts) {
> -  return new (C) ObjCClassDecl(DC, L, Elts, Locs, nElts, C);
> +                                     ObjCInterfaceDecl *const Elt,
> +                                     const SourceLocation Loc) {
> +  return new (C) ObjCClassDecl(DC, L, Elt, Loc, C);
> }
> 
> +void ObjCClassDecl::setClass(ASTContext &C, ObjCInterfaceDecl*const Cls,
> +                             const SourceLocation Loc) {
> +    
> +  ForwardDecl = (ObjCClassRef*) C.Allocate(sizeof(ObjCClassRef),
> +                                           llvm::alignOf<ObjCClassRef>());
> +  new (ForwardDecl) ObjCClassRef(Cls, Loc);
> +}
> +    
> SourceRange ObjCClassDecl::getSourceRange() const {
>   // FIXME: We should include the semicolon
> -  assert(NumDecls);
> -  return SourceRange(getLocation(), ForwardDecls[NumDecls-1].getLocation());
> +  return SourceRange(getLocation(), ForwardDecl->getLocation());
> }
> 
> //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/AST/DeclPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/DeclPrinter.cpp Sat Aug 27 15:50:59 2011
> @@ -812,11 +812,7 @@
> 
> void DeclPrinter::VisitObjCClassDecl(ObjCClassDecl *D) {
>   Out << "@class ";
> -  for (ObjCClassDecl::iterator I = D->begin(), E = D->end();
> -       I != E; ++I) {
> -    if (I != D->begin()) Out << ", ";
> -    Out << I->getInterface();
> -  }
> +  Out << D->getForwardInterfaceDecl();
> }
> 
> void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) {
> 
> Modified: cfe/trunk/lib/AST/DumpXML.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DumpXML.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DumpXML.cpp (original)
> +++ cfe/trunk/lib/AST/DumpXML.cpp Sat Aug 27 15:50:59 2011
> @@ -742,8 +742,7 @@
> 
>   // ObjCClassDecl
>   void visitObjCClassDeclChildren(ObjCClassDecl *D) {
> -    for (ObjCClassDecl::iterator I = D->begin(), E = D->end(); I != E; ++I)
> -      visitDeclRef(I->getInterface());
> +    visitDeclRef(D->getForwardInterfaceDecl());
>   }
> 
>   // ObjCInterfaceDecl
> 
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Sat Aug 27 15:50:59 2011
> @@ -707,9 +707,7 @@
>   }
> 
>   if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(D)) {
> -    for (ObjCClassDecl::iterator I = Class->begin(), IEnd = Class->end();
> -         I != IEnd; ++I)
> -      AddTopLevelDeclarationToHash(I->getInterface(), Hash);
> +    AddTopLevelDeclarationToHash(Class->getForwardInterfaceDecl(), Hash);
>     return;
>   }
> }
> 
> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Sat Aug 27 15:50:59 2011
> @@ -29,47 +29,59 @@
> /// [OBJC]  objc-protocol-definition
> /// [OBJC]  objc-method-definition
> /// [OBJC]  '@' 'end'
> -Decl *Parser::ParseObjCAtDirectives() {
> +Parser::DeclGroupPtrTy Parser::ParseObjCAtDirectives() {
>   SourceLocation AtLoc = ConsumeToken(); // the "@"
> 
>   if (Tok.is(tok::code_completion)) {
>     Actions.CodeCompleteObjCAtDirective(getCurScope());
>     ConsumeCodeCompletionToken();
>   }
> -
> +    
> +  Decl *SingleDecl = 0;
>   switch (Tok.getObjCKeywordID()) {
>   case tok::objc_class:
>     return ParseObjCAtClassDeclaration(AtLoc);
> +    break;
>   case tok::objc_interface: {
>     ParsedAttributes attrs(AttrFactory);
> -    return ParseObjCAtInterfaceDeclaration(AtLoc, attrs);
> +    SingleDecl = ParseObjCAtInterfaceDeclaration(AtLoc, attrs);
> +    break;
>   }
>   case tok::objc_protocol: {
>     ParsedAttributes attrs(AttrFactory);
> -    return ParseObjCAtProtocolDeclaration(AtLoc, attrs);
> +    SingleDecl = ParseObjCAtProtocolDeclaration(AtLoc, attrs);
> +    break;
>   }
>   case tok::objc_implementation:
> -    return ParseObjCAtImplementationDeclaration(AtLoc);
> +    SingleDecl = ParseObjCAtImplementationDeclaration(AtLoc);
> +    break;
>   case tok::objc_end:
> -    return ParseObjCAtEndDeclaration(AtLoc);
> +    SingleDecl = ParseObjCAtEndDeclaration(AtLoc);
> +    break;
>   case tok::objc_compatibility_alias:
> -    return ParseObjCAtAliasDeclaration(AtLoc);
> +    SingleDecl = ParseObjCAtAliasDeclaration(AtLoc);
> +    break;
>   case tok::objc_synthesize:
> -    return ParseObjCPropertySynthesize(AtLoc);
> +    SingleDecl = ParseObjCPropertySynthesize(AtLoc);
> +    break;
>   case tok::objc_dynamic:
> -    return ParseObjCPropertyDynamic(AtLoc);
> +    SingleDecl = ParseObjCPropertyDynamic(AtLoc);
> +    break;
>   default:
>     Diag(AtLoc, diag::err_unexpected_at);
>     SkipUntil(tok::semi);
> -    return 0;
> +    SingleDecl = 0;
> +    break;
>   }
> +  return Actions.ConvertDeclToDeclGroup(SingleDecl);
> }
> 
> ///
> /// objc-class-declaration:
> ///    '@' 'class' identifier-list ';'
> ///
> -Decl *Parser::ParseObjCAtClassDeclaration(SourceLocation atLoc) {
> +Parser::DeclGroupPtrTy
> +Parser::ParseObjCAtClassDeclaration(SourceLocation atLoc) {
>   ConsumeToken(); // the identifier "class"
>   SmallVector<IdentifierInfo *, 8> ClassNames;
>   SmallVector<SourceLocation, 8> ClassLocs;
> @@ -79,7 +91,7 @@
>     if (Tok.isNot(tok::identifier)) {
>       Diag(Tok, diag::err_expected_ident);
>       SkipUntil(tok::semi);
> -      return 0;
> +      return Actions.ConvertDeclToDeclGroup(0);
>     }
>     ClassNames.push_back(Tok.getIdentifierInfo());
>     ClassLocs.push_back(Tok.getLocation());
> @@ -93,7 +105,7 @@
> 
>   // Consume the ';'.
>   if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@class"))
> -    return 0;
> +    return Actions.ConvertDeclToDeclGroup(0);
> 
>   return Actions.ActOnForwardClassDeclaration(atLoc, ClassNames.data(),
>                                               ClassLocs.data(),
> 
> Modified: cfe/trunk/lib/Parse/Parser.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/Parser.cpp (original)
> +++ cfe/trunk/lib/Parse/Parser.cpp Sat Aug 27 15:50:59 2011
> @@ -593,10 +593,7 @@
>     break;
>   }
>   case tok::at:
> -    // @ is not a legal token unless objc is enabled, no need to check for ObjC.
> -    /// FIXME: ParseObjCAtDirectives should return a DeclGroup for things like
> -    /// @class foo, bar;
> -    SingleDecl = ParseObjCAtDirectives();
> +    return ParseObjCAtDirectives();
>     break;
>   case tok::minus:
>   case tok::plus:
> 
> Modified: cfe/trunk/lib/Rewrite/RewriteObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteObjC.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Rewrite/RewriteObjC.cpp (original)
> +++ cfe/trunk/lib/Rewrite/RewriteObjC.cpp Sat Aug 27 15:50:59 2011
> @@ -161,8 +161,13 @@
> 
>     // Top Level Driver code.
>     virtual void HandleTopLevelDecl(DeclGroupRef D) {
> -      for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I)
> +      for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) {
> +        if (isa<ObjCClassDecl>((*I))) {
> +          RewriteForwardClassDecl(D);
> +          break;
> +        }
>         HandleTopLevelSingleDecl(*I);
> +      }
>     }
>     void HandleTopLevelSingleDecl(Decl *D);
>     void HandleDeclInMainFile(Decl *D);
> @@ -241,7 +246,7 @@
> 
>     // Syntactic Rewriting.
>     void RewriteInclude();
> -    void RewriteForwardClassDecl(ObjCClassDecl *Dcl);
> +    void RewriteForwardClassDecl(DeclGroupRef D);
>     void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
>                                  ObjCImplementationDecl *IMD,
>                                  ObjCCategoryImplDecl *CID);
> @@ -886,30 +891,28 @@
>   InsertText(onePastSemiLoc, Setr);
> }
> 
> -void RewriteObjC::RewriteForwardClassDecl(ObjCClassDecl *ClassDecl) {
> -  // Get the start location and compute the semi location.
> -  SourceLocation startLoc = ClassDecl->getLocation();
> -  const char *startBuf = SM->getCharacterData(startLoc);
> -  const char *semiPtr = strchr(startBuf, ';');
> -
> -  // Translate to typedef's that forward reference structs with the same name
> -  // as the class. As a convenience, we include the original declaration
> -  // as a comment.
> +void RewriteObjC::RewriteForwardClassDecl(DeclGroupRef D) {
> +  SourceLocation startLoc;
>   std::string typedefString;
> -  typedefString += "// @class ";
> -  for (ObjCClassDecl::iterator I = ClassDecl->begin(), E = ClassDecl->end();
> -       I != E; ++I) {
> -    ObjCInterfaceDecl *ForwardDecl = I->getInterface();
> -    typedefString += ForwardDecl->getNameAsString();
> -    if (I+1 != E)
> -      typedefString += ", ";
> -    else
> +  const char *startBuf = 0;
> +  const char *semiPtr = 0;
> +  for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) {
> +    ObjCClassDecl *ClassDecl = cast<ObjCClassDecl>(*I);
> +    ObjCInterfaceDecl *ForwardDecl = ClassDecl->getForwardInterfaceDecl();
> +    if (I == D.begin()) {
> +      // Get the start location and compute the semi location.
> +      startLoc = ClassDecl->getLocation();
> +      startBuf = SM->getCharacterData(startLoc);
> +      semiPtr = strchr(startBuf, ';');
> +      typedefString += "// @class ";
> +      typedefString += ForwardDecl->getNameAsString();
>       typedefString += ";\n";
> -  }
> +    }
> +    // Translate to typedef's that forward reference structs with the same name
> +    // as the class. As a convenience, we include the original declaration
> +    // as a comment.
> +  
> 
> -  for (ObjCClassDecl::iterator I = ClassDecl->begin(), E = ClassDecl->end();
> -       I != E; ++I) {
> -    ObjCInterfaceDecl *ForwardDecl = I->getInterface();
>     typedefString += "#ifndef _REWRITER_typedef_";
>     typedefString += ForwardDecl->getNameAsString();
>     typedefString += "\n";
> @@ -5887,8 +5890,8 @@
>     ClassImplementation.push_back(CI);
>   else if (ObjCCategoryImplDecl *CI = dyn_cast<ObjCCategoryImplDecl>(D))
>     CategoryImplementation.push_back(CI);
> -  else if (ObjCClassDecl *CD = dyn_cast<ObjCClassDecl>(D))
> -    RewriteForwardClassDecl(CD);
> +  else if (isa<ObjCClassDecl>(D))
> +    assert(false && "RewriteObjC::HandleDeclInMainFile - ObjCClassDecl");
>   else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
>     RewriteObjCQualifiedInterfaceTypes(VD);
>     if (isTopLevelBlockPointerType(VD->getType()))
> 
> Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Sat Aug 27 15:50:59 2011
> @@ -5405,12 +5405,11 @@
> 
>     // Record any forward-declared interfaces we find.
>     if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) {
> -      for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end();
> -           C != CEnd; ++C)
> -        if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) &&
> -            (!OnlyUnimplemented || !C->getInterface()->getImplementation()))
> -          Results.AddResult(Result(C->getInterface(), 0), CurContext,
> -                            0, false);
> +      ObjCInterfaceDecl *IDecl = Forward->getForwardInterfaceDecl();
> +      if ((!OnlyForwardDeclarations || IDecl->isForwardDecl()) &&
> +          (!OnlyUnimplemented || !IDecl->getImplementation()))
> +        Results.AddResult(Result(IDecl, 0), CurContext,
> +                          0, false);
>     }
>   }
> }
> 
> Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Sat Aug 27 15:50:59 2011
> @@ -1657,13 +1657,12 @@
> }
> 
> /// ActOnForwardClassDeclaration -
> -Decl *
> +Sema::DeclGroupPtrTy
> Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
>                                    IdentifierInfo **IdentList,
>                                    SourceLocation *IdentLocs,
>                                    unsigned NumElts) {
> -  SmallVector<ObjCInterfaceDecl*, 32> Interfaces;
> -
> +  SmallVector<Decl *, 8> DeclsInGroup;
>   for (unsigned i = 0; i != NumElts; ++i) {
>     // Check for another declaration kind with the same name.
>     NamedDecl *PrevDecl
> @@ -1708,17 +1707,14 @@
>       PushOnScopeChains(IDecl, TUScope, false);
>       CurContext->makeDeclVisibleInContext(IDecl, true);
>     }
> -
> -    Interfaces.push_back(IDecl);
> +    ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, CurContext, AtClassLoc,
> +                                                 IDecl, IdentLocs[i]);
> +    CurContext->addDecl(CDecl);
> +    CheckObjCDeclScope(CDecl);
> +    DeclsInGroup.push_back(CDecl);
>   }
> -
> -  assert(Interfaces.size() == NumElts);
> -  ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, CurContext, AtClassLoc,
> -                                               Interfaces.data(), IdentLocs,
> -                                               Interfaces.size());
> -  CurContext->addDecl(CDecl);
> -  CheckObjCDeclScope(CDecl);
> -  return CDecl;
> +  
> +  return BuildDeclaratorGroup(DeclsInGroup.data(), DeclsInGroup.size(), false);
> }
> 
> static bool tryMatchRecordTypes(ASTContext &Context,
> 
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Sat Aug 27 15:50:59 2011
> @@ -2670,14 +2670,11 @@
>           }
>         }
>       } else if (ObjCClassDecl *Class = dyn_cast<ObjCClassDecl>(*D)) {
> -        for (ObjCClassDecl::iterator I = Class->begin(), IEnd = Class->end();
> -             I != IEnd; ++I) {
> -          ObjCInterfaceDecl *IFace = I->getInterface();
> +          ObjCInterfaceDecl *IFace = Class->getForwardInterfaceDecl();
>           if (Result.isAcceptableDecl(IFace)) {
>             Consumer.FoundDecl(IFace, Visited.checkHidden(IFace), InBaseClass);
>             Visited.add(IFace);
>           }
> -        }
>       }
> 
>       // Visit transparent contexts and inline namespaces inside this context.
> 
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Sat Aug 27 15:50:59 2011
> @@ -123,8 +123,8 @@
>                                             ClassTemplateSpecializationDecl *D);
>     void VisitClassTemplatePartialSpecializationDecl(
>                                      ClassTemplatePartialSpecializationDecl *D);
> -    void VisitClassScopeFunctionSpecializationDecl(
> -                                       ClassScopeFunctionSpecializationDecl *D);
> +    void VisitClassScopeFunctionSpecializationDecl(
> +                                       ClassScopeFunctionSpecializationDecl *D);
>     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
>     void VisitValueDecl(ValueDecl *VD);
>     void VisitEnumConstantDecl(EnumConstantDecl *ECD);
> @@ -573,17 +573,9 @@
> 
> void ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) {
>   VisitDecl(CD);
> -  unsigned NumClassRefs = Record[Idx++];
> -  SmallVector<ObjCInterfaceDecl *, 16> ClassRefs;
> -  ClassRefs.reserve(NumClassRefs);
> -  for (unsigned I = 0; I != NumClassRefs; ++I)
> -    ClassRefs.push_back(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
> -  SmallVector<SourceLocation, 16> SLocs;
> -  SLocs.reserve(NumClassRefs);
> -  for (unsigned I = 0; I != NumClassRefs; ++I)
> -    SLocs.push_back(ReadSourceLocation(Record, Idx));
> -  CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(),
> -                   NumClassRefs);
> +  ObjCInterfaceDecl *ClassRef = ReadDeclAs<ObjCInterfaceDecl>(Record, Idx);
> +  SourceLocation SLoc = ReadSourceLocation(Record, Idx);
> +  CD->setClass(*Reader.getContext(), ClassRef, SLoc);
> }
> 
> void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
> @@ -1211,8 +1203,8 @@
>   }
> }
> 
> -void ASTDeclReader::VisitClassScopeFunctionSpecializationDecl(
> -                                    ClassScopeFunctionSpecializationDecl *D) {
> +void ASTDeclReader::VisitClassScopeFunctionSpecializationDecl(
> +                                    ClassScopeFunctionSpecializationDecl *D) {
>   VisitDecl(D);
>   D->Specialization = ReadDeclAs<CXXMethodDecl>(Record, Idx);
> }
> 
> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Sat Aug 27 15:50:59 2011
> @@ -65,8 +65,8 @@
>                                             ClassTemplateSpecializationDecl *D);
>     void VisitClassTemplatePartialSpecializationDecl(
>                                      ClassTemplatePartialSpecializationDecl *D);
> -    void VisitClassScopeFunctionSpecializationDecl(
> -                                       ClassScopeFunctionSpecializationDecl *D);
> +    void VisitClassScopeFunctionSpecializationDecl(
> +                                       ClassScopeFunctionSpecializationDecl *D);
>     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
>     void VisitValueDecl(ValueDecl *D);
>     void VisitEnumConstantDecl(EnumConstantDecl *D);
> @@ -503,11 +503,8 @@
> 
> void ASTDeclWriter::VisitObjCClassDecl(ObjCClassDecl *D) {
>   VisitDecl(D);
> -  Record.push_back(D->size());
> -  for (ObjCClassDecl::iterator I = D->begin(), IEnd = D->end(); I != IEnd; ++I)
> -    Writer.AddDeclRef(I->getInterface(), Record);
> -  for (ObjCClassDecl::iterator I = D->begin(), IEnd = D->end(); I != IEnd; ++I)
> -    Writer.AddSourceLocation(I->getLocation(), Record);
> +  Writer.AddDeclRef(D->getForwardInterfaceDecl(), Record);
> +  Writer.AddSourceLocation(D->getForwardDecl()->getLocation(), Record);
>   Code = serialization::DECL_OBJC_CLASS;
> }
> 
> @@ -1107,8 +1104,8 @@
>   Code = serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION;
> }
> 
> -void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl(
> -                                    ClassScopeFunctionSpecializationDecl *D) {
> +void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl(
> +                                    ClassScopeFunctionSpecializationDecl *D) {
>   VisitDecl(D);
>   Writer.AddDeclRef(D->getSpecialization(), Record);
>   Code = serialization::DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION;
> 
> Modified: cfe/trunk/test/Rewriter/rewrite-forward-class.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/rewrite-forward-class.m?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/test/Rewriter/rewrite-forward-class.m (original)
> +++ cfe/trunk/test/Rewriter/rewrite-forward-class.m Sat Aug 27 15:50:59 2011
> @@ -1,4 +1,5 @@
> -// RUN: %clang_cc1 -rewrite-objc -o - %s
> +// RUN: %clang_cc1 -x objective-c -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
> +// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
> // rdar://6969189
> 
> @class XX;
> @@ -6,3 +7,29 @@
> @class ISyncClient, SMSession, ISyncManager, ISyncSession, SMDataclassInfo, SMClientInfo,
>     DMCConfiguration, DMCStatusEntry;
> 
> + at interface QQ
> +
> + at end
> +
> + at interface SMDataclassInfo : QQ
> +- (XX*) Meth;
> +- (DMCStatusEntry*)Meth2;
> + at end
> +
> + at implementation SMDataclassInfo
> +- (XX*) Meth { return 0; }
> +- (DMCStatusEntry*)Meth2 { return 0; }
> + at end
> +
> + at interface YY 
> +{
> +  ISyncClient *p1;
> +  ISyncSession *p2;
> +}
> + at property (copy) ISyncClient *p1;
> + at end
> +
> + at implementation YY
> + at synthesize p1;
> + at end
> +
> 
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=138709&r1=138708&r2=138709&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Sat Aug 27 15:50:59 2011
> @@ -1100,10 +1100,9 @@
> }
> 
> bool CursorVisitor::VisitObjCClassDecl(ObjCClassDecl *D) {
> -  for (ObjCClassDecl::iterator C = D->begin(), CEnd = D->end(); C != CEnd; ++C)
> -    if (Visit(MakeCursorObjCClassRef(C->getInterface(), C->getLocation(), TU)))
> +  if (Visit(MakeCursorObjCClassRef(D->getForwardInterfaceDecl(), 
> +                                   D->getForwardDecl()->getLocation(), TU)))
>       return true;
> -
>   return false;
> }
> 
> @@ -4219,8 +4218,8 @@
>   Decl *D = Storage.get<Decl*>();
>   if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
>     return Using->shadow_size();
> -  if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D))
> -    return Classes->size();
> +  if (isa<ObjCClassDecl>(D))
> +    return 1;
>   if (ObjCForwardProtocolDecl *Protocols =dyn_cast<ObjCForwardProtocolDecl>(D))
>     return Protocols->protocol_size();
> 
> @@ -4250,10 +4249,8 @@
>     std::advance(Pos, index);
>     return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
>   }
> -  
>   if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D))
> -    return MakeCXCursor(Classes->begin()[index].getInterface(), TU);
> -  
> +    return MakeCXCursor(Classes->getForwardInterfaceDecl(), TU);
>   if (ObjCForwardProtocolDecl *Protocols = dyn_cast<ObjCForwardProtocolDecl>(D))
>     return MakeCXCursor(Protocols->protocol_begin()[index], TU);
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list