isuckatcs wrote: > I think this might be working around the issue rather than fixing it. It > looks to me like the bug is in `Decl::printGroup`: > > https://github.com/llvm/llvm-project/blob/f4023d4d5d6a6f35ef2315f1b1ce7dd35f24e901/clang/lib/AST/DeclPrinter.cpp#L223 > > We are printing the tag _definition_ here if the tag _declaration_ is part of > the `DeclGroup`. I think that the `if(TD)` on the line above that one should > instead be something like: > > ```c++ > if (TD && (TD->isThisDeclarationADefinition() || > TD->isThisDeclarationADemotedDefinition())) > ``` > > (That is: print the tag definition if the tag declaration in the decl group > was written as a definition.)
Initially I was thinking about tweaking `Decl::printGroup` but I wasn't entirely sure about it. Now that I'm experimenting with your proposed solution, it seems there is an edge case, which we need to handle explicitly. ```c++ enum __attribute__((aligned(16))) T *p0; ``` ```c++ EnumDecl ... T `-AlignedAttr ... aligned `-ConstantExpr ... 'int' |-value: Int 16 `-IntegerLiteral ... 'int' 16 ``` This enum doesn't have a definition but has attributes, which are not printed unless `SubPolicy.IncludeTagDefinition` is set to `true`. If we explicitly check for `TD->hasAttrs()`, we are back at the original issue. ```c++ struct A { int x; }; struct Class { enum __attribute__((aligned(16))) T *(*next)(struct A *q); }; ``` ```c++ struct A { int x; }; struct Class { enum __attribute__((aligned(16))) T *(*next)(struct A { int x; } *); }; ``` At this point we either ignore the implicitly generated `TagDecl`, or we can tweak the attribute printing, so that they are printed even if we only print the declaration, though when I tried that 10 test cases failed, so I'm not sure we want to pursue that solution. https://github.com/llvm/llvm-project/pull/69971 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits