[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