diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-06-29 22:33:26 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-06-29 22:33:26 +0000 |
| commit | 2be8bf44cd0cc8719d01e947beda7640406b4db4 (patch) | |
| tree | b671e619691f9456eea5bb2ad315135bb3ef7b90 /clang/lib/Sema/SemaDeclCXX.cpp | |
| parent | 911edef65be0c4bff17b752b44b5f29a97f938b1 (diff) | |
| download | bcm5719-llvm-2be8bf44cd0cc8719d01e947beda7640406b4db4.tar.gz bcm5719-llvm-2be8bf44cd0cc8719d01e947beda7640406b4db4.zip | |
Diagnose multiple initialzation of data-member/base
in the ctor-initializer list. More to come.
llvm-svn: 74465
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e9a585f2836..fffa66c68fc 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -766,6 +766,24 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, Diag(ColonLoc, diag::err_only_constructors_take_base_inits); return; } + llvm::DenseSet<uintptr_t>Members; + + for (unsigned i = 0; i < NumMemInits; i++) { + CXXBaseOrMemberInitializer *Member = + static_cast<CXXBaseOrMemberInitializer*>(MemInits[i]); + if (Members.count(Member->getBaseOrMember()) == 0) + Members.insert(Member->getBaseOrMember()); + else { + if (FieldDecl *Field = Member->getMember()) + Diag(ColonLoc, diag::error_multiple_mem_initialization) + << Field->getNameAsString(); + else if (Type *BaseClass = Member->getBaseClass()) + Diag(ColonLoc, diag::error_multiple_base_initialization) + << BaseClass->getDesugaredType(true); + else + assert(false && "ActOnMemInitializers - neither field or base"); + } + } } namespace { |

