[clang] [clang] fix transformation of SubstNonTypeTemplateParmExpr nodes from type alias templates and concepts (PR #200850)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 1 09:48:05 PDT 2026
================
@@ -1496,6 +1496,12 @@ class DeclRefExpr final
setDependence(computeDependence(this, Context));
}
+ /// This DeclRefExpr is parenthesized as if it were written in parentheses,
+ /// e.g., "(x)". This is used in replacement expressions produced from
+ /// canonical template arguments.
+ bool isParenthesized() const { return DeclRefExprBits.IsParenthesized; }
----------------
mizvekov wrote:
Well, this is probably not the best place to see what's happening, you can scroll down to where 'setParenthesized' is used.
But basically we have a `TemplateArgument` of declaration kind, converted to a parameter of reference type.
When converting this argument back to expression, this is normally converted to a DeclRef, with possible implicit casts. In order to preserve this reference type in a decltype expression, we could wrap the expression in parenthesis, but under old standards, we are not allowed to look through parenthesis around declarations used as template arguments.
We would have to use an AST node which is looked through under these old standards, but is not considered an implicit cast.
So I am thinking either this solution here, a new bit for ParenExpr, or possibly a new AST node, something like an ImplicitParenExpr.
https://github.com/llvm/llvm-project/pull/200850
More information about the cfe-commits
mailing list