================
@@ -2316,6 +2316,20 @@ void
ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
}
VisitCXXMethodDecl(D);
+
+ // Microsoft CXX ABI specific:
+ // Restore the RecordToCopyCtor sidecar LUT entry so that `throw` expressions
+ // find the correct copy constructor for exceptions during codegen.
+ // There is no need to check the target info because the
+ // HasCopyConstructorForExceptionObject bit only gets set for the MS ABI.
+ if (D->isCopyConstructor()) {
+ // TODO What if this is not the same copy constructor which was chosen by
+ // LookupCopyingConstructor() in SemaExprCXX? Is there a better way?
----------------
rnk wrote:
I'm proud of the depth of the test cases we added when implementing this the
first time. There may be modules bugs, but at least there are good tests, and I
remembered how to leverage them, so we don't have to rediscover all the edge
cases. :)
I think we don't have to worry about cases involving deleted copy ctors because
they will be diagnosed at the catch site (attempting to catch an uncopyable
type by value), so the catchable type entry will effectively be dead. Skipping
those entries is probably the right thing to do.
I think templated copy ctors is what makes this hard. The `throw` expression
will instantiate the appropriate template, but the natural thing to do in other
parts of the AST is store the lookup result in the AST and use it later in
codegen.
I guess the most straightforward thing to do here is to create a special
serialization record, like VTABLE_USES, that records a record type and a
relevant copy constructor.
https://github.com/llvm/llvm-project/pull/114075
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits