When implementing C11 _Alignas in
<http://gcc.gnu.org/ml/gcc-patches/2011-11/msg00841.html>, I noted
that I has omitted checks that alignment was supported (which, as
constraints in C11, should be errors or pedwarns rather than just
plain warnings).

The issues with the C11 definition of alignment remain unresolved,
although there's now N1731 for them (assigned DR numbers 444 and 445).
However, it seems clearly right to me, and in accord with the intent
of C11, that declaring an object with an unsupported alignment should
be an error; in that case, any code generated must be presumed to be
wrong code as it can't respect the alignment required by the user's
source code.

Contrary to what I said when implementing _Alignas, arbitrary stack
alignments are in fact supported on all architectures (PR 33721, fixed
a year before that patch).  Alignments too big for host unsigned int,
when measured in bits, are rejected in
c-common.c:check_user_alignment.  (That's less than ideal - ELF can
represent alignments of up to 2^31 or 2^63 bytes, not bits, depending
on whether it's 32-bit or 64-bit ELF.  But no doubt converting
alignments to be represented in bytes would be a lot of work.)

The alignment checks in varasm.c, however, give warnings rather than
errors.  This patch changes them to errors.

There's no testcase, as at least for the align_variable case it can't
actually generate an error on ELF systems, where MAX_OFILE_ALIGNMENT
is the largest alignment GCC can represent.  (I'm not sure under what
circumstances assemble_noswitch_variable might generate its
diagnostic.)

(I do not make an assertion about whether the existing checks for
supported alignment cover all cases where a requested alignment may
not be supported; any failure to generate the requested alignment,
with no diagnostic given, is an ordinary wrong-code bug.)

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
commit?

2013-11-19  Joseph Myers  <jos...@codesourcery.com>

        * varasm.c (align_variable): Give error instead of warning for
        unsupported alignment.
        (assemble_noswitch_variable): Likewise.

Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c        (revision 204948)
+++ gcc/varasm.c        (working copy)
@@ -960,9 +960,9 @@ align_variable (tree decl, bool dont_output_data)
      In particular, a.out format supports a maximum alignment of 4.  */
   if (align > MAX_OFILE_ALIGNMENT)
     {
-      warning (0, "alignment of %q+D is greater than maximum object "
-               "file alignment.  Using %d", decl,
-              MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
+      error ("alignment of %q+D is greater than maximum object "
+            "file alignment.  Using %d", decl,
+            MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
       align = MAX_OFILE_ALIGNMENT;
     }
 
@@ -1908,8 +1908,8 @@ assemble_noswitch_variable (tree decl, const char
 
   if (!sect->noswitch.callback (decl, name, size, rounded)
       && (unsigned HOST_WIDE_INT) (align / BITS_PER_UNIT) > rounded)
-    warning (0, "requested alignment for %q+D is greater than "
-            "implemented alignment of %wu", decl, rounded);
+    error ("requested alignment for %q+D is greater than "
+          "implemented alignment of %wu", decl, rounded);
 }
 
 /* A subroutine of assemble_variable.  Output the label and contents of

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to