This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
fix handling of '#pragma pack(pop [, id])'
- To: gcc-patches at gcc dot gnu dot org
- Subject: fix handling of '#pragma pack(pop [, id])'
- From: Mike Coleman <mcoleman2 at kc dot rr dot com>
- Date: Fri, 29 Sep 2000 23:00:38 -0500 (CDT)
This patch fixes a problem with '#pragma pack(pop [, id])', which is a MSVC
compatibility feature AFAIK. The current parser insists on the same form for
'push' and 'pop' both
#pragma pack(push [, id], <n>)
#pragma pack(pop [, id], <n>)
but the 'pop' form shouldn't require (or allow, I think) the numeric
parameter. It should parse this
#pragma pack(pop [, id])
instead. This patch fixes the problem, and gives slightly clearer error
messages.
--Mike
2000-09-29 Mike Coleman <mkc@users.sourceforge.net>
* c-pragma.c (handle_pragma_pack): fixed handling of '#pragma
pack(pop [, id])' and improved error messages.
Index: gcc/c-pragma.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-pragma.c,v
retrieving revision 1.37
diff -c -3 -p -r1.37 c-pragma.c
*** c-pragma.c 2000/09/11 04:29:58 1.37
--- c-pragma.c 2000/09/30 03:48:27
*************** handle_pragma_pack (dummy)
*** 186,192 ****
cpp_reader *dummy ATTRIBUTE_UNUSED;
{
tree x, id = 0;
! int align;
enum cpp_ttype token;
enum { set, push, pop } action;
--- 186,192 ----
cpp_reader *dummy ATTRIBUTE_UNUSED;
{
tree x, id = 0;
! int align = -1;
enum cpp_ttype token;
enum { set, push, pop } action;
*************** handle_pragma_pack (dummy)
*** 209,240 ****
else if (token == CPP_NAME)
{
const char *op = IDENTIFIER_POINTER (x);
if (!strcmp (op, "push"))
! action = push;
else if (!strcmp (op, "pop"))
! action = pop;
else
BAD2 ("unknown action '%s' for '#pragma pack' - ignored", op);
if (c_lex (&x) != CPP_COMMA)
! BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
token = c_lex (&x);
if (token == CPP_NAME)
{
id = x;
! if (c_lex (&x) != CPP_COMMA)
! BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
token = c_lex (&x);
}
! if (token == CPP_NUMBER)
! align = TREE_INT_CST_LOW (x);
! else
! BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
! if (c_lex (&x) != CPP_CLOSE_PAREN)
! BAD ("malformed '#pragma pack' - ignored");
}
else
BAD ("malformed '#pragma pack' - ignored");
--- 209,251 ----
else if (token == CPP_NAME)
{
const char *op = IDENTIFIER_POINTER (x);
+ const char *badmsg;
if (!strcmp (op, "push"))
! {
! action = push;
! badmsg = "malformed '#pragma pack(push[, id], <n>)' - ignored";
! }
else if (!strcmp (op, "pop"))
! {
! action = pop;
! badmsg = "malformed '#pragma pack(pop[, id])' - ignored";
! }
else
BAD2 ("unknown action '%s' for '#pragma pack' - ignored", op);
if (c_lex (&x) != CPP_COMMA)
! BAD (badmsg);
token = c_lex (&x);
if (token == CPP_NAME)
{
id = x;
! if (action == push && c_lex (&x) != CPP_COMMA)
! BAD (badmsg);
token = c_lex (&x);
}
! if (action == push)
! if (token == CPP_NUMBER)
! {
! align = TREE_INT_CST_LOW (x);
! token = c_lex (&x);
! }
! else
! BAD (badmsg);
! if (token != CPP_CLOSE_PAREN)
! BAD (badmsg);
}
else
BAD ("malformed '#pragma pack' - ignored");
*************** handle_pragma_pack (dummy)
*** 242,260 ****
if (c_lex (&x) != CPP_EOF)
warning ("junk at end of '#pragma pack'");
! switch (align)
! {
! case 0:
! case 1:
! case 2:
! case 4:
! case 8:
! case 16:
! align *= BITS_PER_UNIT;
! break;
! default:
! BAD2 ("alignment must be a small power of two, not %d", align);
! }
switch (action)
{
--- 253,272 ----
if (c_lex (&x) != CPP_EOF)
warning ("junk at end of '#pragma pack'");
! if (action != pop)
! switch (align)
! {
! case 0:
! case 1:
! case 2:
! case 4:
! case 8:
! case 16:
! align *= BITS_PER_UNIT;
! break;
! default:
! BAD2 ("alignment must be a small power of two, not %d", align);
! }
switch (action)
{