[clang] Rework the printing of attributes (PR #87281)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 5 06:47:40 PDT 2024


================
@@ -73,3 +73,15 @@ class C {
   // CHECK: void pwtt(void *, int) __attribute__((pointer_with_type_tag(foo, 2, 3)));
   void pwtt(void *, int) __attribute__((pointer_with_type_tag(foo, 2, 3)));
 };
+
+#define ANNOTATE_ATTR __attribute__((annotate("Annotated")))
+ANNOTATE_ATTR int annotated_attr ANNOTATE_ATTR = 0;
+// CHECK: __attribute__((annotate("Annotated"))) int annotated_attr __attribute__((annotate("Annotated"))) = 0;
+
+// FIXME: We do not print the attribute as written after the type specifier.
+int ANNOTATE_ATTR annotated_attr_fixme = 0;
----------------
AaronBallman wrote:

The PR changes behavior from one really broken state to a slightly less but still broken state. Consider:
```
[[clang::annotate("do the")]] int [[clang::annotate_type("test")]] * [[clang::annotate_type("again")]] i [[clang::annotate("and again!")]] = 0;
```
Currently we print this back as: `int *i [[clang::annotate_type(...)]] [[clang::annotate_type(...)]] [[clang::annotate("do the")]] [[clang::annotate("and again!")]] = 0;` which is all kinds of wrong. Now we print this back as: `[[clang::annotate("do the")]] int *i [[clang::annotate_type(...)]] [[clang::annotate_type(...)]] [[clang::annotate("and again!")]] = 0;` which is in better shape but still gets the type attributes wrong by moving the attribute off `int` and `*` and onto the declaration of `i`. The new code won't compile (it tries to add type attributes to a declaration, and the `...` instead of the original string literal won't compile either).

Given that printing is best-effort, perhaps this is fine because it's incremental improvement, but we're still not quite there in terms of accurate printing either.

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


More information about the cfe-commits mailing list