[cfe-commits] r75649 - in /cfe/trunk: include/clang/Parse/Action.h lib/AST/DeclCXX.cpp lib/Parse/ParseCXXInlineMethods.cpp lib/Sema/Sema.h lib/Sema/SemaDeclCXX.cpp

Douglas Gregor dgregor at apple.com
Tue Jul 21 09:53:33 PDT 2009


On Jul 14, 2009, at 11:24 AM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Tue Jul 14 13:24:21 2009
> New Revision: 75649
>
> URL: http://llvm.org/viewvc/llvm-project?rev=75649&view=rev
> Log:
> Patch to build AST for ctor's initializer list according to
> semantics of order of construction [class.init].

Very nice.

> Modified:
>    cfe/trunk/include/clang/Parse/Action.h
>    cfe/trunk/lib/AST/DeclCXX.cpp
>    cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>
> Modified: cfe/trunk/include/clang/Parse/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=75649&r1=75648&r2=75649&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Parse/Action.h (original)
> +++ cfe/trunk/include/clang/Parse/Action.h Tue Jul 14 13:24:21 2009
> @@ -1232,6 +1232,8 @@
>                                     SourceLocation ColonLoc,
>                                     MemInitTy **MemInits, unsigned  
> NumMemInits){
>   }
> +
> + virtual void ActOnDefaultInitializers(DeclPtrTy ConstructorDecl) {}
>
>   /// ActOnFinishCXXMemberSpecification - Invoked after all member  
> declarators
>   /// are parsed but *before* parsing of inline method definitions.
>
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=75649&r1=75648&r2=75649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Tue Jul 14 13:24:21 2009
> @@ -482,12 +482,81 @@
>                                     ASTContext &C,
>                                     CXXBaseOrMemberInitializer  
> **Initializers,
>                                     unsigned NumInitializers) {
> +  // We need to build the initializer AST according to order of  
> construction
> +  // and not what user specified in the Initializers list.
> +  // FIXME. We probably don't need this. But it is cleaner.
> +  CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(getDeclContext());
> +  llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
> +  // Push virtual bases before others.
> +  for (CXXRecordDecl::base_class_iterator VBase =
> +       ClassDecl->vbases_begin(),
> +       E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
> +    const Type * T = VBase->getType()->getAsRecordType();
> +    unsigned int i = 0;
> +    for (i = 0; i < NumInitializers; i++) {
> +      CXXBaseOrMemberInitializer *Member = Initializers[i];
> +      if (Member->isBaseInitializer() &&
> +          Member->getBaseClass() == T) {
> +        AllToInit.push_back(Member);
> +        break;
> +      }
> +    }

This is quadratic in the number of initializers, which is rather  
unfortunate. Can we do better than O(N^2)?

> +    if (i == NumInitializers) {
> +      CXXBaseOrMemberInitializer *Member =
> +        new CXXBaseOrMemberInitializer(VBase->getType(), 0,  
> 0,SourceLocation());
> +      AllToInit.push_back(Member);
> +    }
> +  }

Eventually, we'll need to allocate CXXBaseOrMemberInitializers via  
ASTContext. I know there are existing FIXMEs for this, though.

   - Doug



More information about the cfe-commits mailing list