On 2023-10-18 10:51, Qing Zhao wrote:

+   member FIELD_DECL is a valid field of the containing structure's fieldlist,
+   FIELDLIST, Report error and remove this attribute when it's not.  */
+static void
+verify_counted_by_attribute (tree fieldlist, tree field_decl)
+{
+  tree attr_counted_by = lookup_attribute ("counted_by",
+                       DECL_ATTRIBUTES (field_decl));
+
+  if (!attr_counted_by)
+    return;
+
+  /* If there is an counted_by attribute attached to the field,
+     verify it.  */
+
+  const char *fieldname
+    = IDENTIFIER_POINTER (TREE_VALUE (TREE_VALUE (attr_counted_by)));
+
+  /* Verify the argument of the attrbute is a valid field of the
s/attrbute/attribute/
+     containing structure.  */
+
+  tree counted_by_field = get_named_field (fieldlist, fieldname);
+
+  /* Error when the field is not found in the containing structure.  */
+  if (!counted_by_field)
+    {
+      error_at (DECL_SOURCE_LOCATION (field_decl),
+        "%qE attribute argument not a field declaration"
+        " in the same structure, ignore it",
+        (get_attribute_name (attr_counted_by)));
Probably someone with English as a first language would make a better 
suggestion, but how about:
   Argument specified in %qE attribute is not a field declaration in the
   same structure, ignoring it.
+
+      DECL_ATTRIBUTES (field_decl)
+    = remove_attribute ("counted_by", DECL_ATTRIBUTES (field_decl));
+    }
+  else
+  /* Error when the field is not with an integer type.  */
Suggest: Flag an error when the field is not of an integer type.
+    {
+      while (TREE_CHAIN (counted_by_field))
+    counted_by_field = TREE_CHAIN (counted_by_field);
+      tree real_field = TREE_VALUE (counted_by_field);
+
+      if (TREE_CODE (TREE_TYPE (real_field)) != INTEGER_TYPE)
+    {
+      error_at (DECL_SOURCE_LOCATION (field_decl),
+             "%qE attribute argument not a field declaration"
+             " with integer type, ignore it",
+             (get_attribute_name (attr_counted_by)));
Suggest:
   Argument specified in %qE attribute is not of an integer type,
   ignoring it.
+
+      DECL_ATTRIBUTES (field_decl)
+        = remove_attribute ("counted_by", DECL_ATTRIBUTES (field_decl));
+    }
+    }
+
+  return;

I forgot to mention the redundant return here.

Could you please clarify a little bit here, why the return here is redundant?

It's the last line in the function, so even without that statement the function will return.

Thanks,
Sid

Reply via email to