diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-23 23:32:59 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-23 23:32:59 +0000 |
| commit | ca2f085a4e1bc52a23b75cf95e54fe79758d9400 (patch) | |
| tree | f89719453f33672b03f4a6ce663f20335c22699b /clang/lib/Sema/SemaDeclCXX.cpp | |
| parent | 909f6001e9b6f8a05164e890ac3a9f856d0a69ab (diff) | |
| download | bcm5719-llvm-ca2f085a4e1bc52a23b75cf95e54fe79758d9400.tar.gz bcm5719-llvm-ca2f085a4e1bc52a23b75cf95e54fe79758d9400.zip | |
Diagnose when base classes and members to be intialized
with constructors don't have a matching constructor.
llvm-svn: 76913
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c12878c7603..d5c8c3d3fce 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -810,6 +810,26 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD, NumArgs, C, IdLoc); } +void +Sema::BuildBaseOrMemberInitializers(ASTContext &C, + CXXConstructorDecl *Constructor, + CXXBaseOrMemberInitializer **Initializers, + unsigned NumInitializers + ) { + llvm::SmallVector<CXXBaseSpecifier *, 4>Bases; + llvm::SmallVector<FieldDecl *, 4>Members; + + Constructor->setBaseOrMemberInitializers(C, + Initializers, NumInitializers, + Bases, Members); + for (unsigned int i = 0; i < Bases.size(); i++) + Diag(Bases[i]->getSourceRange().getBegin(), + diag::err_missing_default_constructor) << 0 << Bases[i]->getType(); + for (unsigned int i = 0; i < Members.size(); i++) + Diag(Members[i]->getLocation(), diag::err_missing_default_constructor) + << 1 << Members[i]->getType(); +} + static void *GetKeyForTopLevelField(FieldDecl *Field) { // For anonymous unions, use the class declaration as the key. if (const RecordType *RT = Field->getType()->getAsRecordType()) { @@ -872,11 +892,11 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, << 0; err = true; } - if (!err) { - Constructor->setBaseOrMemberInitializers(Context, - reinterpret_cast<CXXBaseOrMemberInitializer **>(MemInits), - NumMemInits); - } + if (!err) + BuildBaseOrMemberInitializers(Context, Constructor, + reinterpret_cast<CXXBaseOrMemberInitializer **>(MemInits), + NumMemInits); + if (!err && (Diags.getDiagnosticLevel(diag::warn_base_initialized) != Diagnostic::Ignored || Diags.getDiagnosticLevel(diag::warn_field_initialized) @@ -960,8 +980,9 @@ void Sema::ActOnDefaultCtorInitializers(DeclPtrTy CDtorDecl) { if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(CDtorDecl.getAs<Decl>())) - Constructor->setBaseOrMemberInitializers(Context, - (CXXBaseOrMemberInitializer **)0, 0); + BuildBaseOrMemberInitializers(Context, + Constructor, + (CXXBaseOrMemberInitializer **)0, 0); } namespace { |

