This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Emit error for negative _Alignas alignment values


This patch detects and emits an error if the value provided in _Alignas
is negative. The fix was approved pending full regression testing in a
previous discussion (http://gcc.gnu.org/ml/gcc/2013-03/msg00282.html). 
To add to that patch, I have added a testcase that explicitly checks for the
error for a negative power of 2.

Bootstrapped and regression tested with x86_64-unknown-linux-gnu with no new
failures.

If ok, could someone commit please? I don't have commit access.

Regards
Senthil

ChangeLog

2013-04-03	Senthil Kumar Selvaraj	<senthil_kumar.selvaraj@atmel.com>

	* c-common.c (check_user_alignment): Emit error for negative values
    
	* gcc.dg/c1x-align-3.c: Add test for negative power of 2

diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
index c7cdd0f..dfdfbb6 100644
--- gcc/c-family/c-common.c
+++ gcc/c-family/c-common.c
@@ -7308,9 +7308,10 @@ check_user_alignment (const_tree align, bool allow_zero)
     }
   else if (allow_zero && integer_zerop (align))
     return -1;
-  else if ((i = tree_log2 (align)) == -1)
+  else if (tree_int_cst_sgn (align) == -1
+           || (i = tree_log2 (align)) == -1)
     {
-      error ("requested alignment is not a power of 2");
+      error ("requested alignment is not a positive power of 2");
       return -1;
     }
   else if (i >= HOST_BITS_PER_INT - BITS_PER_UNIT_LOG)
diff --git gcc/testsuite/gcc.dg/c1x-align-3.c gcc/testsuite/gcc.dg/c1x-align-3.c
index 0b2a77f..b97351c 100644
--- gcc/testsuite/gcc.dg/c1x-align-3.c
+++ gcc/testsuite/gcc.dg/c1x-align-3.c
@@ -23,6 +23,7 @@ _Alignas (-(__LONG_LONG_MAX__-1)/4) char i3; /* { dg-error "too large|power of 2
 _Alignas (-(__LONG_LONG_MAX__-1)/8) char i4; /* { dg-error "too large|power of 2" } */
 _Alignas (-(__LONG_LONG_MAX__-1)/16) char i5; /* { dg-error "too large|power of 2" } */
 _Alignas (-1) char j; /* { dg-error "power of 2" } */
+_Alignas (-2) char j; /* { dg-error "positive power of 2" } */
 _Alignas (3) char k; /* { dg-error "power of 2" } */
 
 _Alignas ((void *) 1) char k; /* { dg-error "integer constant" } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]