================
@@ -1824,6 +1825,12 @@ class CodeGenModule : public CodeGenTypeCache {
return PAlign;
}
+ /// Helper function to construct a RuntimeTrapDiagnosticBuilder
+ [[nodiscard]] std::unique_ptr<RuntimeTrapDiagnosticBuilder>
+ RuntimeDiag(unsigned DiagID) {
+ return std::make_unique<RuntimeTrapDiagnosticBuilder>(&getDiags(), DiagID);
+ }
+
----------------
Sirraide wrote:
So if I’m understanding this correctly, the reason why you can’t ‘just put it
on the stack’ is because the act of creating the diagnostic builder also
eventually formats the diagnostic (because that’s the whole point of it after
all), and we only want to create the diagnostic if we actually need it. That
makes sense, and having a separate class to hold the message would probably
work. Another idea I just had is to use `std::optional`:
```
std::optional<RuntimeTrapDiagnosticBuilder> DB;
if (some_condition) {
DB = CGM.RuntimeDiag(trap_ubsan_arith) << 0 << someExpr;
};
consume(DB);
```
I wonder if this avoids copying the string after we format if we can just hold
on to the diagnostic builder; we’d even avoid formatting the diagnostic until
it’s actually used (in case we ever decide to create but not use it), and we’d
be able to add more diagnostic arguments to it later on—that said, I’m not sure
how well this approach would work, so feel free to go with whatever approach
you think makes this easier to implement and maintain. ;Þ
https://github.com/llvm/llvm-project/pull/154618
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits