[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

Fariborz Jahanian fjahanian at apple.com
Wed Jul 22 13:27:46 PDT 2009


On Jul 21, 2009, at 9:53 AM, Douglas Gregor wrote:

>
> 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].
>>
>> 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)?

Yes. Done in r76776

- Fariborz

>



More information about the cfe-commits mailing list