From: David Blaikie Date: Thu, 17 Jan 2013 05:26:25 +0000 (+0000) Subject: ArrayRef-ize some ctor initializer related APIs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93c8617bec98aeb769ee9f569d7ed439eec03249;p=clang ArrayRef-ize some ctor initializer related APIs git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 20fe22b440..af4d16b84f 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -4370,9 +4370,9 @@ public: bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer); - bool SetCtorInitializers(CXXConstructorDecl *Constructor, - CXXCtorInitializer **Initializers, - unsigned NumInitializers, bool AnyErrors); + bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, + ArrayRef Initializers = + ArrayRef()); void SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation); @@ -4435,8 +4435,7 @@ public: void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, - CXXCtorInitializer **MemInits, - unsigned NumMemInits, + ArrayRef MemInits, bool AnyErrors); void CheckCompletedCXXClass(CXXRecordDecl *Record); diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index d78cc51a77..cc3318501a 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -2675,8 +2675,7 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) { } } while (true); - Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc, - MemInitializers.data(), MemInitializers.size(), + Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc, MemInitializers, AnyErrors); } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 2e73a4e9cd..c794d7e964 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -3062,19 +3062,17 @@ Sema::SetDelegatingInitializer(CXXConstructorDecl *Constructor, return false; } -bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, - CXXCtorInitializer **Initializers, - unsigned NumInitializers, - bool AnyErrors) { +bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, + ArrayRef Initializers) { if (Constructor->isDependentContext()) { // Just store the initializers as written, they will be checked during // instantiation. - if (NumInitializers > 0) { - Constructor->setNumCtorInitializers(NumInitializers); + if (!Initializers.empty()) { + Constructor->setNumCtorInitializers(Initializers.size()); CXXCtorInitializer **baseOrMemberInitializers = - new (Context) CXXCtorInitializer*[NumInitializers]; - memcpy(baseOrMemberInitializers, Initializers, - NumInitializers * sizeof(CXXCtorInitializer*)); + new (Context) CXXCtorInitializer*[Initializers.size()]; + memcpy(baseOrMemberInitializers, Initializers.data(), + Initializers.size() * sizeof(CXXCtorInitializer*)); Constructor->setCtorInitializers(baseOrMemberInitializers); } @@ -3095,7 +3093,7 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool HadError = false; - for (unsigned i = 0; i < NumInitializers; i++) { + for (unsigned i = 0; i < Initializers.size(); i++) { CXXCtorInitializer *Member = Initializers[i]; if (Member->isBaseInitializer()) @@ -3198,7 +3196,7 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, } } - NumInitializers = Info.AllToInit.size(); + unsigned NumInitializers = Info.AllToInit.size(); if (NumInitializers > 0) { Constructor->setNumCtorInitializers(NumInitializers); CXXCtorInitializer **baseOrMemberInitializers = @@ -3256,18 +3254,16 @@ static void *GetKeyForMember(ASTContext &Context, return Field; } -static void -DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, - const CXXConstructorDecl *Constructor, - CXXCtorInitializer **Inits, - unsigned NumInits) { +static void DiagnoseBaseOrMemInitializerOrder( + Sema &SemaRef, const CXXConstructorDecl *Constructor, + ArrayRef Inits) { if (Constructor->getDeclContext()->isDependentContext()) return; // Don't check initializers order unless the warning is enabled at the // location of at least one initializer. bool ShouldCheckOrder = false; - for (unsigned InitIndex = 0; InitIndex != NumInits; ++InitIndex) { + for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) { CXXCtorInitializer *Init = Inits[InitIndex]; if (SemaRef.Diags.getDiagnosticLevel(diag::warn_initializer_out_of_order, Init->getSourceLocation()) @@ -3313,7 +3309,7 @@ DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, unsigned IdealIndex = 0; CXXCtorInitializer *PrevInit = 0; - for (unsigned InitIndex = 0; InitIndex != NumInits; ++InitIndex) { + for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) { CXXCtorInitializer *Init = Inits[InitIndex]; void *InitKey = GetKeyForMember(SemaRef.Context, Init); @@ -3423,8 +3419,7 @@ bool CheckRedundantUnionInit(Sema &S, /// ActOnMemInitializers - Handle the member initializers for a constructor. void Sema::ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, - CXXCtorInitializer **meminits, - unsigned NumMemInits, + ArrayRef MemInits, bool AnyErrors) { if (!ConstructorDecl) return; @@ -3439,9 +3434,6 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl, return; } - CXXCtorInitializer **MemInits = - reinterpret_cast(meminits); - // Mapping for the duplicate initializers check. // For member initializers, this is keyed with a FieldDecl*. // For base initializers, this is keyed with a Type*. @@ -3451,7 +3443,7 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl, RedundantUnionMap MemberUnions; bool HadError = false; - for (unsigned i = 0; i < NumMemInits; i++) { + for (unsigned i = 0; i < MemInits.size(); i++) { CXXCtorInitializer *Init = MemInits[i]; // Set the source order index. @@ -3469,7 +3461,7 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl, } else { assert(Init->isDelegatingInitializer()); // This must be the only initializer - if (NumMemInits != 1) { + if (MemInits.size() != 1) { Diag(Init->getSourceLocation(), diag::err_delegating_initializer_alone) << Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange(); @@ -3484,9 +3476,9 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl, if (HadError) return; - DiagnoseBaseOrMemInitializerOrder(*this, Constructor, MemInits, NumMemInits); + DiagnoseBaseOrMemInitializerOrder(*this, Constructor, MemInits); - SetCtorInitializers(Constructor, MemInits, NumMemInits, AnyErrors); + SetCtorInitializers(Constructor, AnyErrors, MemInits); } void @@ -3608,7 +3600,7 @@ void Sema::ActOnDefaultCtorInitializers(Decl *CDtorDecl) { if (CXXConstructorDecl *Constructor = dyn_cast(CDtorDecl)) - SetCtorInitializers(Constructor, 0, 0, /*AnyErrors=*/false); + SetCtorInitializers(Constructor, /*AnyErrors=*/false); } bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T, @@ -7523,7 +7515,7 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, SynthesizedFunctionScope Scope(*this, Constructor); DiagnosticErrorTrap Trap(Diags); - if (SetCtorInitializers(Constructor, 0, 0, /*AnyErrors=*/false) || + if (SetCtorInitializers(Constructor, /*AnyErrors=*/false) || Trap.hasErrorOccurred()) { Diag(CurrentLocation, diag::note_member_synthesized_at) << CXXDefaultConstructor << Context.getTagDeclType(ClassDecl); @@ -9151,7 +9143,7 @@ void Sema::DefineImplicitCopyConstructor(SourceLocation CurrentLocation, SynthesizedFunctionScope Scope(*this, CopyConstructor); DiagnosticErrorTrap Trap(Diags); - if (SetCtorInitializers(CopyConstructor, 0, 0, /*AnyErrors=*/false) || + if (SetCtorInitializers(CopyConstructor, /*AnyErrors=*/false) || Trap.hasErrorOccurred()) { Diag(CurrentLocation, diag::note_member_synthesized_at) << CXXCopyConstructor << Context.getTagDeclType(ClassDecl); @@ -9342,7 +9334,7 @@ void Sema::DefineImplicitMoveConstructor(SourceLocation CurrentLocation, SynthesizedFunctionScope Scope(*this, MoveConstructor); DiagnosticErrorTrap Trap(Diags); - if (SetCtorInitializers(MoveConstructor, 0, 0, /*AnyErrors=*/false) || + if (SetCtorInitializers(MoveConstructor, /*AnyErrors=*/false) || Trap.hasErrorOccurred()) { Diag(CurrentLocation, diag::note_member_synthesized_at) << CXXMoveConstructor << Context.getTagDeclType(ClassDecl); diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 2c00be66f3..b0935a54ac 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3134,7 +3134,7 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New, ActOnMemInitializers(New, /*FIXME: ColonLoc */ SourceLocation(), - NewInits.data(), NewInits.size(), + NewInits, AnyErrors); }