diff options
author | Mike Coleman <mcoleman2@kc.rr.com> | 2000-10-28 00:04:11 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2000-10-28 00:04:11 +0000 |
commit | 63eb1269483a23914c535d12afd5b5e0f4e02391 (patch) | |
tree | 72e1c2ef417dd127c4cd13c98dac0385b812a71e /gcc/c-pragma.c | |
parent | ae2eceaad2f95f7228e69ab5513f355e868ab787 (diff) | |
download | gcc-63eb1269483a23914c535d12afd5b5e0f4e02391.zip gcc-63eb1269483a23914c535d12afd5b5e0f4e02391.tar.gz gcc-63eb1269483a23914c535d12afd5b5e0f4e02391.tar.bz2 |
c-pragma.c (handle_pragma_pack): Initialize align to -1.
2000-10-21 Mike Coleman <mcoleman2@kc.rr.com>
* c-pragma.c (handle_pragma_pack): Initialize align to -1.
Improve error messages. Correct parsing of
#pragma pack(pop [,id]). Do not check the user-supplied
alignment if we're popping.
* gcc.dg/pack-test-1.c: New test case.
* gcc.dg/pack-test-2.c: New test case.
* gcc.dg/pack-test-1.h: New file.
From-SVN: r37095
Diffstat (limited to 'gcc/c-pragma.c')
-rw-r--r-- | gcc/c-pragma.c | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c index 8503f3c..a9f41f9 100644 --- a/gcc/c-pragma.c +++ b/gcc/c-pragma.c @@ -60,8 +60,8 @@ typedef struct align_stack static struct align_stack * alignment_stack = NULL; -/* If we have a "global" #pragma pack(<n>) if effect when the first - #pragma push(pack,<n>) is encountered, this stores the the value of +/* If we have a "global" #pragma pack(<n>) in effect when the first + #pragma pack(push,<n>) is encountered, this stores the value of maximum_field_alignment in effect. When the final pop_alignment() happens, we restore the value to this, not to a value of 0 for maximum_field_alignment. Value is in bits. */ @@ -186,7 +186,7 @@ handle_pragma_pack (dummy) cpp_reader *dummy ATTRIBUTE_UNUSED; { tree x, id = 0; - int align; + int align = -1; enum cpp_ttype token; enum { set, push, pop } action; @@ -208,6 +208,12 @@ handle_pragma_pack (dummy) } else if (token == CPP_NAME) { +#define BAD_ACTION do { if (action == push) \ + BAD ("malformed '#pragma pack(push[, id], <n>)' - ignored"); \ + else \ + BAD ("malformed '#pragma pack(pop[, id])' - ignored"); \ + } while (0) + const char *op = IDENTIFIER_POINTER (x); if (!strcmp (op, "push")) action = push; @@ -216,25 +222,36 @@ handle_pragma_pack (dummy) 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) + if (token != CPP_COMMA && action == push) + BAD_ACTION; + + if (token == CPP_COMMA) { - id = x; - 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 (action == push && c_lex (&x) != CPP_COMMA) + BAD_ACTION; + 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 (action == push) + { + if (token == CPP_NUMBER) + { + align = TREE_INT_CST_LOW (x); + token = c_lex (&x); + } + else + BAD_ACTION; + } + } - if (c_lex (&x) != CPP_CLOSE_PAREN) - BAD ("malformed '#pragma pack' - ignored"); + if (token != CPP_CLOSE_PAREN) + BAD_ACTION; +#undef BAD_ACTION } else BAD ("malformed '#pragma pack' - ignored"); @@ -242,19 +259,20 @@ handle_pragma_pack (dummy) 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); - } + 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) { |