[PATCH] D25777: [Sema][TreeTransform] Re-create DesignatedInitExpr when it has a field designator with a valid FieldDecl

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 21 04:46:34 PDT 2016


arphaman added a comment.

In https://reviews.llvm.org/D25777#575564, @rjmccall wrote:

> The fact that this bug only arises when performing a *second* instantiation suggests that there's a deeper bug here, because template instantiation is not supposed to modify the pattern AST.  In this case, the basic problem is that, when the parser processes a designator, it only has an identifier, not a FieldDecl*, because it doesn't know what type is being initialized yet.  SemaInit eventually resolves that identifier to a FieldDecl and needs to record that in the AST; typically the AST is treated as immutable, but in this case, instead of cloning the expression, Sema just modifies the field designator in-place.  That's not completely unreasonable, and it's definitely the most space-efficient solution for non-template code-building; but in template code, it does mean that we have to take care to not present the same unresolved field designator to Sema twice.
>
> Fortunately, this is pretty easy: we just need to need to flag the expression as needing rebuilding when there isn't a resolved field in the field designator.  When there *is* a resolved field, we just need to map it using TransformDecl; the expression then only needs to be rebuilt if that fails or returns a different declaration.


You're right, the point that you made about modifying the pattern AST is correct. I will update the patch accordingly.


Repository:
  rL LLVM

https://reviews.llvm.org/D25777





More information about the cfe-commits mailing list