This covers temporary constructors for which a destructor is necessary. It is necessary to support CXXTemporaryObjectExpr here, which is a "constructor in the middle of nowhere" expression like C() - it's a sub-class of CXXConstructExpr which we didn't even notice yet because it didn't appear in construction contexts we added support for in the previous patches, but it does commonly appear in CXXBindTemporaryExprs and failing to consume the construction context would trigger the construction context overwrite assertion.
Note that when the destructor is trivial, CXXBindTemporaryExpr is omitted, and in that case we don't provide any construction context yet. In such cases there's no trigger statement at all, for example the following code:
struct S {}; void foo() { S(); }
would produce the following AST:
`-FunctionDecl 0x7fea280366a0 <line:3:1, line:5:1> line:3:6 foo 'void ()' `-CompoundStmt 0x7fea28036d98 <col:12, line:5:1> `-CXXTemporaryObjectExpr 0x7fea28036c70 <line:4:3, col:5> 'S' 'void () noexcept' zeroing
... and that's it.
So in that case we'd have to make a special kind of construction context that merely conveys that we are sure that we are indeed constructing a simple temporary object because we were directly told to do so by the programmer. But that's another story.