Commit 4337bc93 by Zack Weinberg Committed by Zack Weinberg

c-pragma.c (handle_pragma_pack): Correct parsing logic so it won't give a…

c-pragma.c (handle_pragma_pack): Correct parsing logic so it won't give a spurious error for '#pragma pack()'.

	* c-pragma.c (handle_pragma_pack): Correct parsing logic so it
	won't give a spurious error for '#pragma pack()'.  Simplify
	control flow for readability.  'reset' action is not necessary.

From-SVN: r36308
parent d8ea8f28
2000-09-10 Zack Weinberg <zack@wolery.cumb.org> 2000-09-10 Zack Weinberg <zack@wolery.cumb.org>
* c-pragma.c (handle_pragma_pack): Correct parsing logic so it
won't give a spurious error for '#pragma pack()'. Simplify
control flow for readability. 'reset' action is not necessary.
2000-09-10 Zack Weinberg <zack@wolery.cumb.org>
* defaults.h: Provide default definitions for: CHAR_TYPE_SIZE, * defaults.h: Provide default definitions for: CHAR_TYPE_SIZE,
SHORT_TYPE_SIZE, INT_TYPE_SIZE, LONG_TYPE_SIZE, SHORT_TYPE_SIZE, INT_TYPE_SIZE, LONG_TYPE_SIZE,
LONG_LONG_TYPE_SIZE, WCHAR_TYPE_SIZE, FLOAT_TYPE_SIZE, LONG_LONG_TYPE_SIZE, WCHAR_TYPE_SIZE, FLOAT_TYPE_SIZE,
......
...@@ -188,59 +188,57 @@ handle_pragma_pack (dummy) ...@@ -188,59 +188,57 @@ handle_pragma_pack (dummy)
tree x, id = 0; tree x, id = 0;
int align; int align;
enum cpp_ttype token; enum cpp_ttype token;
enum { set, reset, push, pop } action; enum { set, push, pop } action;
if (c_lex (&x) != CPP_OPEN_PAREN) if (c_lex (&x) != CPP_OPEN_PAREN)
BAD ("missing '(' after '#pragma pack' - ignored"); BAD ("missing '(' after '#pragma pack' - ignored");
token = c_lex (&x); token = c_lex (&x);
if (token == CPP_CLOSE_PAREN) if (token == CPP_CLOSE_PAREN)
action = reset; {
action = set;
align = 0;
}
else if (token == CPP_NUMBER) else if (token == CPP_NUMBER)
{ {
align = TREE_INT_CST_LOW (x); align = TREE_INT_CST_LOW (x);
action = set; action = set;
if (c_lex (&x) != CPP_CLOSE_PAREN)
BAD ("malformed '#pragma pack' - ignored");
} }
else if (token == CPP_NAME) else if (token == CPP_NAME)
{ {
if (!strcmp (IDENTIFIER_POINTER (x), "push")) const char *op = IDENTIFIER_POINTER (x);
if (!strcmp (op, "push"))
action = push; action = push;
else if (!strcmp (IDENTIFIER_POINTER (x), "pop")) else if (!strcmp (op, "pop"))
action = pop; action = pop;
else else
BAD2 ("unknown action '%s' for '#pragma pack' - ignored", BAD2 ("unknown action '%s' for '#pragma pack' - ignored", op);
IDENTIFIER_POINTER (x));
}
else
BAD ("malformed '#pragma pack' - ignored");
token = c_lex (&x); if (c_lex (&x) != CPP_COMMA)
if ((action == set || action == reset) && token != CPP_CLOSE_PAREN) BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
BAD ("malformed '#pragma pack' - ignored");
if ((action == push || action == pop) && token != CPP_COMMA)
BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored",
action == push ? "push" : "pop");
if (action == push || action == pop)
{
token = c_lex (&x); token = c_lex (&x);
if (token == CPP_NAME) if (token == CPP_NAME)
{ {
id = x; id = x;
if (c_lex (&x) != CPP_COMMA) if (c_lex (&x) != CPP_COMMA)
BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
action == push ? "push" : "pop");
token = c_lex (&x); token = c_lex (&x);
} }
if (token == CPP_NUMBER) if (token == CPP_NUMBER)
align = TREE_INT_CST_LOW (x); align = TREE_INT_CST_LOW (x);
else else
BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", BAD2 ("malformed '#pragma pack(%s[, id], <n>)' - ignored", op);
action == push ? "push" : "pop");
if (c_lex (&x) != CPP_CLOSE_PAREN) if (c_lex (&x) != CPP_CLOSE_PAREN)
BAD ("malformed '#pragma pack' - ignored"); BAD ("malformed '#pragma pack' - ignored");
} }
else
BAD ("malformed '#pragma pack' - ignored");
if (c_lex (&x) != CPP_EOF) if (c_lex (&x) != CPP_EOF)
warning ("junk at end of '#pragma pack'"); warning ("junk at end of '#pragma pack'");
...@@ -261,7 +259,6 @@ handle_pragma_pack (dummy) ...@@ -261,7 +259,6 @@ handle_pragma_pack (dummy)
switch (action) switch (action)
{ {
case set: SET_GLOBAL_ALIGNMENT (align); break; case set: SET_GLOBAL_ALIGNMENT (align); break;
case reset: SET_GLOBAL_ALIGNMENT (0); break;
case push: push_alignment (align, id); break; case push: push_alignment (align, id); break;
case pop: pop_alignment (id); break; case pop: pop_alignment (id); break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment