[clang] [Clang] Preserve CXXParenListInitExpr in TreeTransform. (PR #138518)

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 5 00:59:20 PDT 2025


alexfh wrote:

> > @alexfh I don't have the resources to look into this issue. Please revert if you need to.
> 
> This has been in trunk for a long time, a revert here would be HIGHLY unfortunate. I would vastly prefer someone spend time trying to figure out why we are confused with the variable init here instead.

It would be really unfortunate indeed, if we have to revert this. But that's a clearly incorrect codegen, so the only alternative is to get a fix.

I looked a bit into this and came up with a slightly more compact test case: https://gcc.godbolt.org/z/Pcj8954Ye
```
struct Node {
  long val;
};
void Push(Node *);
template <bool>
void BatchPull() {
    Push(new Node(0));
}
void TestBody() {
    (void)BatchPull<true>; 
}
```
Similarly to https://github.com/llvm/llvm-project/pull/138518#issuecomment-2930816205, AST dump already shows the problem (https://godbolt.org/z/PYeG1v5Yz) - `ImplicitCastExpr` to `long` is dropped from the template instantiation:
```
|-FunctionTemplateDecl <line:5:1, line:8:1> line:6:6 BatchPull
| |-NonTypeTemplateParmDecl <line:5:11> col:15 'bool' depth 0 index 0
| |-FunctionDecl <line:6:1, line:8:1> line:6:6 BatchPull 'void ()'
| | `-CompoundStmt <col:18, line:8:1>
| |   `-CallExpr <line:7:5, col:21> 'void'
| |     |-ImplicitCastExpr <col:5> 'void (*)(Node *)' <FunctionToPointerDecay>
| |     | `-DeclRefExpr <col:5> 'void (Node *)' lvalue Function 0x389dae98 'Push' 'void (Node *)'
| |     `-CXXNewExpr <col:10, col:20> 'Node *' Function 0x389db540 'operator new' 'void *(unsigned long)'
| |       `-CXXParenListInitExpr <col:18, col:20> 'Node'
| |         `-ImplicitCastExpr <col:19> 'long' <IntegralCast>
| |           `-IntegerLiteral <col:19> 'int' 0
| `-FunctionDecl <line:6:1, line:8:1> line:6:6 used BatchPull 'void ()' implicit_instantiation
|   |-TemplateArgument integral 'true'
|   `-CompoundStmt <col:18, line:8:1>
|     `-CallExpr <line:7:5, col:21> 'void'
|       |-ImplicitCastExpr <col:5> 'void (*)(Node *)' <FunctionToPointerDecay>
|       | `-DeclRefExpr <col:5> 'void (Node *)' lvalue Function 0x389dae98 'Push' 'void (Node *)'
|       `-CXXNewExpr <col:10, col:20> 'Node *' Function 0x389db540 'operator new' 'void *(unsigned long)'
|         `-CXXParenListInitExpr <col:18, col:20> 'Node'
|           `-IntegerLiteral <col:19> 'int' 0
```

I'm trying to figure out how this commit affects the relevant template instantiation logic, but no ideas so far.

https://github.com/llvm/llvm-project/pull/138518


More information about the cfe-commits mailing list