Skip to content

Commit cb60af0

Browse files
committed
In the mangleCXXCtorVTable function, the mangleType function never adds RD into the substitution, which causes a substitution index error
1 parent 614aeda commit cb60af0

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7326,11 +7326,13 @@ void ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD,
73267326
raw_ostream &Out) {
73277327
// <special-name> ::= TC <type> <offset number> _ <base type>
73287328
CXXNameMangler Mangler(*this, Out);
7329+
QualType RDType = getASTContext().getRecordType(RD);
7330+
QualType TypeType = getASTContext().getRecordType(Type);
73297331
Mangler.getStream() << "_ZTC";
7330-
Mangler.mangleNameOrStandardSubstitution(RD);
7332+
Mangler.mangleType(RDType);
73317333
Mangler.getStream() << Offset;
73327334
Mangler.getStream() << '_';
7333-
Mangler.mangleNameOrStandardSubstitution(Type);
7335+
Mangler.mangleType(TypeType);
73347336
}
73357337

73367338
void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) {

clang/test/CodeGenCXX/mangle.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ struct Y { };
1111
//CHECK: @pr5966_i = external global
1212
//CHECK: @_ZL8pr5966_j = internal global
1313

14+
//CHECK: @_ZTCN6test624InstE0_NS_1A4ImplINS1_4WrapEEE
15+
1416
// CHECK-LABEL: define{{.*}} zeroext i1 @_ZplRK1YRA100_P1X
1517
bool operator+(const Y&, X* (&xs)[100]) { return false; }
1618

@@ -1214,3 +1216,25 @@ namespace test61 {
12141216
// CHECK-LABEL: @_ZN6test611fINS_1XEEEvNT_1Y1aENS3_1bE
12151217
template void f<X>(int, int);
12161218
}
1219+
1220+
namespace test62 {
1221+
namespace A {
1222+
1223+
class VBase {
1224+
public:
1225+
virtual ~VBase() {};
1226+
};
1227+
1228+
struct Wrap {};
1229+
1230+
template <typename T>
1231+
class Impl : public virtual VBase {
1232+
public:
1233+
};
1234+
1235+
} // namespace A
1236+
1237+
struct Inst : public A::Impl<A::Wrap> {};
1238+
1239+
void Test() { Inst a; }
1240+
}

0 commit comments

Comments
 (0)