@@ -1092,6 +1092,74 @@ A high-level overview of support for standards features, including modules, can
1092
1092
be found on the `C++ Feature Status <https://clang.llvm.org/cxx_status.html >`_
1093
1093
page.
1094
1094
1095
+ Missing VTables for classes attached to modules
1096
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1097
+
1098
+ Now the compiler may miss emitting the definition of vtables
1099
+ for classes attached to modules, if the definition of the class
1100
+ doesn't contain any key function in that module units
1101
+ (The key function is the first non-pure virtual function that is
1102
+ not inline at the point of class definition.)
1103
+
1104
+ (Note: technically, the key function is not a thing for modules.
1105
+ We use the concept here for convinient.)
1106
+
1107
+ For example,
1108
+
1109
+ .. code-block :: c++
1110
+
1111
+ // layer1.cppm
1112
+ export module foo:layer1;
1113
+ struct Fruit {
1114
+ virtual ~Fruit() = default;
1115
+ virtual void eval() = 0;
1116
+ };
1117
+ struct Banana : public Fruit {
1118
+ Banana() {}
1119
+ void eval() override;
1120
+ };
1121
+
1122
+ // layer2.cppm
1123
+ export module foo:layer2;
1124
+ import :layer1;
1125
+ export void layer2_fun() {
1126
+ Banana *b = new Banana();
1127
+ b->eval();
1128
+ }
1129
+ void Banana::eval() {
1130
+ }
1131
+
1132
+ For the above example, we can't find the definition for the vtable of
1133
+ class ``Banana `` in any object files.
1134
+
1135
+ The expected behavior is, for dynamic classes attached to named modules,
1136
+ the vtable should always be emitted to the module units the class attaches
1137
+ to.
1138
+
1139
+ To workaround the problem, users can add the key function manually in the
1140
+ corresponding module units. e.g.,
1141
+
1142
+ .. code-block :: c++
1143
+
1144
+ // layer1.cppm
1145
+ export module foo:layer1;
1146
+ struct Fruit {
1147
+ virtual ~Fruit() = default;
1148
+ virtual void eval() = 0;
1149
+ };
1150
+ struct Banana : public Fruit {
1151
+ // Hack a key function to hint the compiler to emit the virtual table.
1152
+ virtual void anchor();
1153
+
1154
+ Banana() {}
1155
+ void eval() override;
1156
+ };
1157
+
1158
+ void Banana::anchor() {}
1159
+
1160
+ This is tracked by
1161
+ `#70585 <https://github.com/llvm/llvm-project/issues/70585 >`_.
1162
+
1095
1163
Including headers after import is not well-supported
1096
1164
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1097
1165
0 commit comments