Richard Biener <rguenth at gcc dot> changed:

           What    |Removed                     |Added
             Status|NEW                         |ASSIGNED
          Component|lto                         |c
           Assignee|unassigned at gcc dot      |rguenth at gcc dot

--- Comment #4 from Richard Biener <rguenth at gcc dot> ---
Anyhow, fixing the ICE yields:

t.ii:2:41: warning: ignoring attribute ‘packed’ because it conflicts with
attribute ‘aligned’ [-Wattributes]
   int *__attribute__((aligned, packed)) a;

it looks like ->exclude isn't applied before handle_*.

And if I remove aligned then packed flag setting "works", so that is
likely the underlying issue.  Which means it is a C family / middle-end
issue after all.

Not sure how to resolve this w/o splitting handlers even more or
merging handle_* and exclusion.

Martin, you added the exclusion mechanism - we likely ran into this issue
before but the exclusion mechanism doesn't "undo" the flag setting effects
of the earlier handle_* routines even though it says the attribute is ignored.

Note that even with just

struct {
  int *__attribute__((packed)) a;
} b;

a type variant is built but we do not end up verifying it, it somehow
gets collected.  This is all a bit confusing but clearly

static tree
handle_packed_attribute (tree *node, tree name, tree ARG_UNUSED (args),
                         int flags, bool *no_add_attrs)
  if (TYPE_P (*node))
      if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
        *node = build_variant_type_copy (*node);
      TYPE_PACKED (*node) = 1;

is bogus.  Maybe it should really build a distinct type copy here.  Maybe
the issue is that for ((aligned, packed)) we handle the attributes separately.
Given that aligned is documented to not reduce alignment w/o packed when
used on structs or struct members it's odd that we diagnose its use
on types rather than silently ignoring it:

When used on a struct, or struct member, the @code{aligned} attribute can
only increase the alignment; in order to decrease it, the @code{packed}
attribute must be specified as well.  When used as part of a typedef, the
@code{aligned} attribute can both increase and decrease alignment, and
specifying the @code{packed} attribute generates a warning.

I am testing

diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index f91add488bb..8cb87eb8154 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -502,8 +502,13 @@ handle_packed_attribute (tree *node, tree name, tree
ARG_UNUSED (args),
   if (TYPE_P (*node))
       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
-       *node = build_variant_type_copy (*node);
-      TYPE_PACKED (*node) = 1;
+       {
+         warning (OPT_Wattributes,
+                  "%qE attribute ignored for type %qT", name, *node);
+         *no_add_attrs = true;
+       }
+      else
+       TYPE_PACKED (*node) = 1;
   else if (TREE_CODE (*node) == FIELD_DECL)

Reply via email to