forked from OSchip/llvm-project
Revert r230314, "Fix codegen for virtual methods that are (re-) exported from multiple modules."
It crashes for targeting (i686|x86_64)-win32. clang: clang/lib/AST/VTableBuilder.cpp:142: {anonymous}::FinalOverriders::OverriderInfo {anonymous}::FinalOverriders::getOverrider(const clang::CXXMethodDecl*, clang::CharUnits) const: Assertion `OverridersMap.count(std::make_pair(MD, BaseOffset)) && "Did not find overrider!"' failed. llvm-svn: 230406
This commit is contained in:
parent
e0dd0f23b8
commit
e976aab1df
|
@ -411,8 +411,7 @@ void FinalOverriders::dump(raw_ostream &Out, BaseSubobject Base,
|
|||
for (const auto *MD : RD->methods()) {
|
||||
if (!MD->isVirtual())
|
||||
continue;
|
||||
MD = MD->getCanonicalDecl();
|
||||
|
||||
|
||||
OverriderInfo Overrider = getOverrider(MD, Base.getBaseOffset());
|
||||
|
||||
Out << " ";
|
||||
|
@ -696,7 +695,6 @@ void VCallAndVBaseOffsetBuilder::AddVCallOffsets(BaseSubobject Base,
|
|||
for (const auto *MD : RD->methods()) {
|
||||
if (!MD->isVirtual())
|
||||
continue;
|
||||
MD = MD->getCanonicalDecl();
|
||||
|
||||
CharUnits OffsetOffset = getCurrentOffsetOffset();
|
||||
|
||||
|
@ -1516,7 +1514,6 @@ void ItaniumVTableBuilder::AddMethods(
|
|||
for (const auto *MD : RD->methods()) {
|
||||
if (!MD->isVirtual())
|
||||
continue;
|
||||
MD = MD->getCanonicalDecl();
|
||||
|
||||
// Get the final overrider.
|
||||
FinalOverriders::OverriderInfo Overrider =
|
||||
|
@ -2199,7 +2196,6 @@ void ItaniumVTableBuilder::dumpLayout(raw_ostream &Out) {
|
|||
// We only want virtual member functions.
|
||||
if (!MD->isVirtual())
|
||||
continue;
|
||||
MD = MD->getCanonicalDecl();
|
||||
|
||||
std::string MethodName =
|
||||
PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual,
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
#ifndef A_H
|
||||
#define A_H
|
||||
|
||||
struct A {
|
||||
virtual void x();
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,17 +0,0 @@
|
|||
#ifndef B_H
|
||||
#define B_H
|
||||
|
||||
#include "a.h"
|
||||
|
||||
class B : virtual public A {
|
||||
virtual void x() {}
|
||||
};
|
||||
|
||||
void b(A* p) {
|
||||
p->x();
|
||||
// Instantiating a class that virtually inherits 'A'
|
||||
// triggers calculation of the vtable offsets in 'A'.
|
||||
B b;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,6 +0,0 @@
|
|||
#ifndef C_H
|
||||
#define C_H
|
||||
|
||||
#include "a.h"
|
||||
|
||||
#endif
|
|
@ -1,11 +0,0 @@
|
|||
module "a" {
|
||||
textual header "a.h"
|
||||
}
|
||||
|
||||
module "b" {
|
||||
header "b.h"
|
||||
}
|
||||
|
||||
module "c" {
|
||||
header "c.h"
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
// RUN: rm -rf %t
|
||||
|
||||
// First, build two modules that both re-export the same header.
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=b -o %t/b.pcm -fmodule-maps \
|
||||
// RUN: -emit-module %S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \
|
||||
// RUN: -I %S/Inputs/merge-vtable-codegen
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=c -o %t/c.pcm -fmodule-maps \
|
||||
// RUN: -emit-module %S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \
|
||||
// RUN: -I %S/Inputs/merge-vtable-codegen
|
||||
|
||||
// Use the two modules in a single compile.
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-file=%t/b.pcm -fmodule-file=%t/c.pcm \
|
||||
// RUN: -fmodule-map-file=%S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \
|
||||
// RUN: -emit-llvm -o %t/test.o %s
|
||||
|
||||
// Note that order is important:
|
||||
// Module 'c' just reexports A, while module 'b' defines a method that uses a
|
||||
// virtual method of A.
|
||||
#include "Inputs/merge-vtable-codegen/c.h"
|
||||
#include "Inputs/merge-vtable-codegen/b.h"
|
||||
|
||||
void t() {
|
||||
b(nullptr);
|
||||
}
|
Loading…
Reference in New Issue