summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-07-10 20:13:23 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-07-10 20:13:23 +0000
commit3554b5a37c79551fc48f7322a95b817781ca6f1b (patch)
tree6e7b216aaaf2f5bd8beeb1176be8edac0a5cfd47 /clang/lib/Sema/SemaDeclCXX.cpp
parent48d983c86e6bcc028bd8071e6f1a228ad8f550da (diff)
downloadbcm5719-llvm-3554b5a37c79551fc48f7322a95b817781ca6f1b.tar.gz
bcm5719-llvm-3554b5a37c79551fc48f7322a95b817781ca6f1b.zip
Patch to build list of inherited virtual base classes
in their order of construction for each class and use it to to check on propery order of base class construction under -Wreorder option. llvm-svn: 75270
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index b942c9c2750..17726c64f04 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -825,14 +825,24 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
NumMemInits);
// Also issue warning if order of ctor-initializer list does not match order
// of 1) base class declarations and 2) order of non-static data members.
- // FIXME. proper handling in the presense of virtual base class.
llvm::SmallVector<const void*, 32> AllBaseOrMembers;
CXXRecordDecl *ClassDecl
= cast<CXXRecordDecl>(Constructor->getDeclContext());
+ // Push virtual bases before others.
+ for (CXXRecordDecl::base_class_iterator VBase =
+ ClassDecl->vbases_begin(),
+ E = ClassDecl->vbases_end(); VBase != E; ++VBase)
+ AllBaseOrMembers.push_back(VBase->getType()->getAsRecordType());
+
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
- E = ClassDecl->bases_end(); Base != E; ++Base)
+ E = ClassDecl->bases_end(); Base != E; ++Base) {
+ // Virtuals are alread in the virtual base list and are constructed
+ // first.
+ if (Base->isVirtual())
+ continue;
AllBaseOrMembers.push_back(Base->getType()->getAsRecordType());
+ }
for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
E = ClassDecl->field_end(); Field != E; ++Field)
OpenPOWER on IntegriCloud