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]

fix handling of '#pragma pack(pop [, id])'


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)
      {


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