summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp23
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;
}
}
}
OpenPOWER on IntegriCloud