r193610 - Fix an assertion when handling a custom case of virtual inheritance; also reduce code duplication
Timur Iskhodzhanov
timurrrr at google.com
Tue Oct 29 07:22:06 PDT 2013
I've decided this change is trivial enough to do post-commit review.
FTR, the FindDirectlyOverriddenMethodInBases function was different
from FindNearestOverriddenMethod just because I didn't quite
understand what is returned by {begin,end}_overridden_methods() in
cases like Test8::Z.
2013/10/29 Timur Iskhodzhanov <timurrrr at google.com>:
> Author: timurrrr
> Date: Tue Oct 29 09:13:45 2013
> New Revision: 193610
>
> URL: http://llvm.org/viewvc/llvm-project?rev=193610&view=rev
> Log:
> Fix an assertion when handling a custom case of virtual inheritance; also reduce code duplication
>
> Modified:
> cfe/trunk/lib/AST/VTableBuilder.cpp
> cfe/trunk/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp
>
> Modified: cfe/trunk/lib/AST/VTableBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=193610&r1=193609&r2=193610&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/VTableBuilder.cpp (original)
> +++ cfe/trunk/lib/AST/VTableBuilder.cpp Tue Oct 29 09:13:45 2013
> @@ -2730,28 +2730,6 @@ VFTableBuilder::ComputeThisOffset(const
> return Ret;
> }
>
> -static const CXXMethodDecl*
> -FindDirectlyOverriddenMethodInBases(const CXXMethodDecl *MD,
> - BasesSetVectorTy &Bases) {
> - // We can't just iterate over the overridden methods and return the first one
> - // which has its parent in Bases, e.g. this doesn't work when we have
> - // multiple subobjects of the same type that have its virtual function
> - // overridden.
> - for (int I = Bases.size(), E = 0; I != E; --I) {
> - const CXXRecordDecl *CurrentBase = Bases[I - 1];
> -
> - for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(),
> - E = MD->end_overridden_methods(); I != E; ++I) {
> - const CXXMethodDecl *OverriddenMD = *I;
> -
> - if (OverriddenMD->getParent() == CurrentBase)
> - return OverriddenMD;
> - }
> - }
> -
> - return 0;
> -}
> -
> static void GroupNewVirtualOverloads(
> const CXXRecordDecl *RD,
> SmallVector<const CXXMethodDecl *, 10> &VirtualMethods) {
> @@ -2843,7 +2821,7 @@ void VFTableBuilder::AddMethods(BaseSubo
> // Check if this virtual member function overrides
> // a method in one of the visited bases.
> if (const CXXMethodDecl *OverriddenMD =
> - FindDirectlyOverriddenMethodInBases(MD, VisitedBases)) {
> + FindNearestOverriddenMethod(MD, VisitedBases)) {
> MethodInfoMapTy::iterator OverriddenMDIterator =
> MethodInfoMap.find(OverriddenMD);
>
> @@ -2887,7 +2865,7 @@ void VFTableBuilder::AddMethods(BaseSubo
> // FIXME: this is O(N^2), can be O(N).
> const CXXMethodDecl *SubOverride = OverriddenMD;
> while ((SubOverride =
> - FindDirectlyOverriddenMethodInBases(SubOverride, VisitedBases))) {
> + FindNearestOverriddenMethod(SubOverride, VisitedBases))) {
> MethodInfoMapTy::iterator SubOverrideIterator =
> MethodInfoMap.find(SubOverride);
> if (SubOverrideIterator == MethodInfoMap.end())
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp?rev=193610&r1=193609&r2=193610&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp Tue Oct 29 09:13:45 2013
> @@ -9,7 +9,8 @@
> // RUN: FileCheck --check-prefix=TEST5 %s < %t
> // RUN: FileCheck --check-prefix=TEST6 %s < %t
> // RUN: FileCheck --check-prefix=TEST7 %s < %t
> -// RUN: FileCheck --check-prefix=TEST8 %s < %t
> +// RUN: FileCheck --check-prefix=TEST8-X %s < %t
> +// RUN: FileCheck --check-prefix=TEST8-Z %s < %t
> // RUN: FileCheck --check-prefix=TEST9-Y %s < %t
> // RUN: FileCheck --check-prefix=TEST9-Z %s < %t
> // RUN: FileCheck --check-prefix=TEST9-W %s < %t
> @@ -236,16 +237,16 @@ namespace Test8 {
>
> // This is a typical diamond inheritance with a shared 'A' vbase.
> struct X : D, C {
> - // TEST8: VFTable for 'D' in 'Test8::X' (1 entries).
> - // TEST8-NEXT: 0 | void D::h()
> + // TEST8-X: VFTable for 'D' in 'Test8::X' (1 entries).
> + // TEST8-X-NEXT: 0 | void D::h()
>
> - // TEST8: VFTable for 'A' in 'D' in 'Test8::X' (2 entries).
> - // TEST8-NEXT: 0 | void Test8::X::f()
> - // TEST8-NEXT: 1 | void A::z()
> -
> - // TEST8: VFTable indices for 'Test8::X' (1 entries).
> - // TEST8-NEXT: via vbtable index 1, vfptr at offset 0
> - // TEST8-NEXT: 0 | void Test8::X::f()
> + // TEST8-X: VFTable for 'A' in 'D' in 'Test8::X' (2 entries).
> + // TEST8-X-NEXT: 0 | void Test8::X::f()
> + // TEST8-X-NEXT: 1 | void A::z()
> +
> + // TEST8-X: VFTable indices for 'Test8::X' (1 entries).
> + // TEST8-X-NEXT: via vbtable index 1, vfptr at offset 0
> + // TEST8-X-NEXT: 0 | void Test8::X::f()
>
> // MANGLING-DAG: @"\01??_7X at Test8@@6BA@@@"
> // MANGLING-DAG: @"\01??_7X at Test8@@6BD@@@"
> @@ -254,6 +255,21 @@ struct X : D, C {
> };
>
> X x;
> +
> +// Another diamond inheritance which led to AST crashes.
> +struct Y : virtual A {};
> +
> +class Z : Y, C {
> + // TEST8-Z: VFTable for 'A' in 'Test8::Y' in 'Test8::Z' (2 entries).
> + // TEST8-Z-NEXT: 0 | void Test8::Z::f()
> + // TEST8-Z-NEXT: 1 | void A::z()
> +
> + // TEST8-Z: VFTable indices for 'Test8::Z' (1 entries).
> + // TEST8-Z-NEXT: via vbtable index 1, vfptr at offset 0
> + // TEST8-Z-NEXT: 0 | void Test8::Z::f()
> + virtual void f();
> +};
> +Z z;
> }
>
> namespace Test9 {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list