diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index fffa66c68fc..e59236c8a4e 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -688,7 +688,8 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD, if (Member) { // FIXME: Perform direct initialization of the member. - return new CXXBaseOrMemberInitializer(Member, (Expr **)Args, NumArgs); + return new CXXBaseOrMemberInitializer(Member, (Expr **)Args, NumArgs, + IdLoc); } // It didn't name a member, so see if it names a class. @@ -750,7 +751,8 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD, return Diag(IdLoc, diag::err_base_init_direct_and_virtual) << MemberOrBase << SourceRange(IdLoc, RParenLoc); - return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs); + return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs, + IdLoc); } void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, @@ -766,22 +768,27 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, Diag(ColonLoc, diag::err_only_constructors_take_base_inits); return; } - llvm::DenseSet<uintptr_t>Members; + llvm::DenseMap<uintptr_t, CXXBaseOrMemberInitializer *>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()); + CXXBaseOrMemberInitializer *&PrevMember = Members[Member->getBaseOrMember()]; + if (!PrevMember) + PrevMember = Member; else { if (FieldDecl *Field = Member->getMember()) - Diag(ColonLoc, diag::error_multiple_mem_initialization) - << Field->getNameAsString(); + Diag(Member->getSourceLocation(), + diag::error_multiple_mem_initialization) + << Field->getNameAsString(); else if (Type *BaseClass = Member->getBaseClass()) - Diag(ColonLoc, diag::error_multiple_base_initialization) + Diag(Member->getSourceLocation(), + diag::error_multiple_base_initialization) << BaseClass->getDesugaredType(true); else assert(false && "ActOnMemInitializers - neither field or base"); + Diag(PrevMember->getSourceLocation(), diag::note_previous_initializer) + << 0; } } } |

