| OLD | NEW |
| 1 /* Part of CPP library. (Macro and #define handling.) | 1 /* Part of CPP library. (Macro and #define handling.) |
| 2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998, | 2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998, |
| 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, | 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, |
| 4 2006, 2007, 2008, 2009 Free Software Foundation, Inc. | 4 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
| 5 Written by Per Bothner, 1994. | 5 Written by Per Bothner, 1994. |
| 6 Based on CCCP program by Paul Rubin, June 1986 | 6 Based on CCCP program by Paul Rubin, June 1986 |
| 7 Adapted to ANSI C, Richard Stallman, Jan 1987 | 7 Adapted to ANSI C, Richard Stallman, Jan 1987 |
| 8 | 8 |
| 9 This program is free software; you can redistribute it and/or modify it | 9 This program is free software; you can redistribute it and/or modify it |
| 10 under the terms of the GNU General Public License as published by the | 10 under the terms of the GNU General Public License as published by the |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 dest = BUFF_FRONT (pfile->u_buff); | 362 dest = BUFF_FRONT (pfile->u_buff); |
| 363 *dest++ = '"'; | 363 *dest++ = '"'; |
| 364 | 364 |
| 365 /* Loop, reading in the argument's tokens. */ | 365 /* Loop, reading in the argument's tokens. */ |
| 366 for (i = 0; i < arg->count; i++) | 366 for (i = 0; i < arg->count; i++) |
| 367 { | 367 { |
| 368 const cpp_token *token = arg->first[i]; | 368 const cpp_token *token = arg->first[i]; |
| 369 | 369 |
| 370 if (token->type == CPP_PADDING) | 370 if (token->type == CPP_PADDING) |
| 371 { | 371 { |
| 372 » if (source == NULL) | 372 » if (source == NULL |
| 373 » || (!(source->flags & PREV_WHITE) |
| 374 » » && token->val.source == NULL)) |
| 373 source = token->val.source; | 375 source = token->val.source; |
| 374 continue; | 376 continue; |
| 375 } | 377 } |
| 376 | 378 |
| 377 escape_it = (token->type == CPP_STRING || token->type == CPP_CHAR | 379 escape_it = (token->type == CPP_STRING || token->type == CPP_CHAR |
| 378 || token->type == CPP_WSTRING || token->type == CPP_WCHAR | 380 || token->type == CPP_WSTRING || token->type == CPP_WCHAR |
| 379 || token->type == CPP_STRING32 || token->type == CPP_CHAR32 | 381 || token->type == CPP_STRING32 || token->type == CPP_CHAR32 |
| 380 » » || token->type == CPP_STRING16 || token->type == CPP_CHAR16); | 382 » » || token->type == CPP_STRING16 || token->type == CPP_CHAR16 |
| 383 » » || token->type == CPP_UTF8STRING); |
| 381 | 384 |
| 382 /* Room for each char being written in octal, initial space and | 385 /* Room for each char being written in octal, initial space and |
| 383 final quote and NUL. */ | 386 final quote and NUL. */ |
| 384 len = cpp_token_len (token); | 387 len = cpp_token_len (token); |
| 385 if (escape_it) | 388 if (escape_it) |
| 386 len *= 4; | 389 len *= 4; |
| 387 len += 3; | 390 len += 3; |
| 388 | 391 |
| 389 if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len) | 392 if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len) |
| 390 { | 393 { |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 up more than one token when expanding macros is in general | 796 up more than one token when expanding macros is in general |
| 794 too difficult. We re-insert it in its own context. */ | 797 too difficult. We re-insert it in its own context. */ |
| 795 _cpp_backup_tokens (pfile, 1); | 798 _cpp_backup_tokens (pfile, 1); |
| 796 if (padding) | 799 if (padding) |
| 797 _cpp_push_token_context (pfile, NULL, padding, 1); | 800 _cpp_push_token_context (pfile, NULL, padding, 1); |
| 798 } | 801 } |
| 799 | 802 |
| 800 return NULL; | 803 return NULL; |
| 801 } | 804 } |
| 802 | 805 |
| 806 /* Return the real number of tokens in the expansion of MACRO. */ |
| 807 static inline unsigned int |
| 808 macro_real_token_count (const cpp_macro *macro) |
| 809 { |
| 810 unsigned int i; |
| 811 if (__builtin_expect (!macro->extra_tokens, true)) |
| 812 return macro->count; |
| 813 for (i = 0; i < macro->count; i++) |
| 814 if (macro->exp.tokens[i].type == CPP_PASTE) |
| 815 return i; |
| 816 abort (); |
| 817 } |
| 818 |
| 803 /* Push the context of a macro with hash entry NODE onto the context | 819 /* Push the context of a macro with hash entry NODE onto the context |
| 804 stack. If we can successfully expand the macro, we push a context | 820 stack. If we can successfully expand the macro, we push a context |
| 805 containing its yet-to-be-rescanned replacement list and return one. | 821 containing its yet-to-be-rescanned replacement list and return one. |
| 806 If there were additionally any unexpanded deferred #pragma directives | 822 If there were additionally any unexpanded deferred #pragma directives |
| 807 among macro arguments, push another context containing the | 823 among macro arguments, push another context containing the |
| 808 pragma tokens before the yet-to-be-rescanned replacement list | 824 pragma tokens before the yet-to-be-rescanned replacement list |
| 809 and return two. Otherwise, we don't push a context and return zero. */ | 825 and return two. Otherwise, we don't push a context and return zero. */ |
| 810 static int | 826 static int |
| 811 enter_macro_context (cpp_reader *pfile, cpp_hashnode *node, | 827 enter_macro_context (cpp_reader *pfile, cpp_hashnode *node, |
| 812 const cpp_token *result) | 828 const cpp_token *result) |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 /* Disable the macro within its expansion. */ | 878 /* Disable the macro within its expansion. */ |
| 863 node->flags |= NODE_DISABLED; | 879 node->flags |= NODE_DISABLED; |
| 864 | 880 |
| 865 if (!(node->flags & NODE_USED)) | 881 if (!(node->flags & NODE_USED)) |
| 866 { | 882 { |
| 867 node->flags |= NODE_USED; | 883 node->flags |= NODE_USED; |
| 868 if (pfile->cb.used_define) | 884 if (pfile->cb.used_define) |
| 869 pfile->cb.used_define (pfile, pfile->directive_line, node); | 885 pfile->cb.used_define (pfile, pfile->directive_line, node); |
| 870 } | 886 } |
| 871 | 887 |
| 888 if (pfile->cb.used) |
| 889 pfile->cb.used (pfile, result->src_loc, node); |
| 890 |
| 872 macro->used = 1; | 891 macro->used = 1; |
| 873 | 892 |
| 874 if (macro->paramc == 0) | 893 if (macro->paramc == 0) |
| 875 » _cpp_push_token_context (pfile, node, macro->exp.tokens, macro->count); | 894 » _cpp_push_token_context (pfile, node, macro->exp.tokens, |
| 895 » » » » macro_real_token_count (macro)); |
| 876 | 896 |
| 877 if (pragma_buff) | 897 if (pragma_buff) |
| 878 { | 898 { |
| 879 if (!pfile->state.in_directive) | 899 if (!pfile->state.in_directive) |
| 880 _cpp_push_token_context (pfile, NULL, | 900 _cpp_push_token_context (pfile, NULL, |
| 881 padding_token (pfile, result), 1); | 901 padding_token (pfile, result), 1); |
| 882 do | 902 do |
| 883 { | 903 { |
| 884 _cpp_buff *tail = pragma_buff->next; | 904 _cpp_buff *tail = pragma_buff->next; |
| 885 pragma_buff->next = NULL; | 905 pragma_buff->next = NULL; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 905 Expand each argument before replacing, unless it is operated upon | 925 Expand each argument before replacing, unless it is operated upon |
| 906 by the # or ## operators. */ | 926 by the # or ## operators. */ |
| 907 static void | 927 static void |
| 908 replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, macro_arg
*args) | 928 replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, macro_arg
*args) |
| 909 { | 929 { |
| 910 unsigned int i, total; | 930 unsigned int i, total; |
| 911 const cpp_token *src, *limit; | 931 const cpp_token *src, *limit; |
| 912 const cpp_token **dest, **first; | 932 const cpp_token **dest, **first; |
| 913 macro_arg *arg; | 933 macro_arg *arg; |
| 914 _cpp_buff *buff; | 934 _cpp_buff *buff; |
| 935 unsigned int count; |
| 915 | 936 |
| 916 /* First, fully macro-expand arguments, calculating the number of | 937 /* First, fully macro-expand arguments, calculating the number of |
| 917 tokens in the final expansion as we go. The ordering of the if | 938 tokens in the final expansion as we go. The ordering of the if |
| 918 statements below is subtle; we must handle stringification before | 939 statements below is subtle; we must handle stringification before |
| 919 pasting. */ | 940 pasting. */ |
| 920 total = macro->count; | 941 count = macro_real_token_count (macro); |
| 921 limit = macro->exp.tokens + macro->count; | 942 total = count; |
| 943 limit = macro->exp.tokens + count; |
| 922 | 944 |
| 923 for (src = macro->exp.tokens; src < limit; src++) | 945 for (src = macro->exp.tokens; src < limit; src++) |
| 924 if (src->type == CPP_MACRO_ARG) | 946 if (src->type == CPP_MACRO_ARG) |
| 925 { | 947 { |
| 926 /* Leading and trailing padding tokens. */ | 948 /* Leading and trailing padding tokens. */ |
| 927 total += 2; | 949 total += 2; |
| 928 | 950 |
| 929 /* We have an argument. If it is not being stringified or | 951 /* We have an argument. If it is not being stringified or |
| 930 pasted it is macro-replaced before insertion. */ | 952 pasted it is macro-replaced before insertion. */ |
| 931 » arg = &args[src->val.arg_no - 1]; | 953 » arg = &args[src->val.macro_arg.arg_no - 1]; |
| 932 | 954 |
| 933 if (src->flags & STRINGIFY_ARG) | 955 if (src->flags & STRINGIFY_ARG) |
| 934 { | 956 { |
| 935 if (!arg->stringified) | 957 if (!arg->stringified) |
| 936 arg->stringified = stringify_arg (pfile, arg); | 958 arg->stringified = stringify_arg (pfile, arg); |
| 937 } | 959 } |
| 938 else if ((src->flags & PASTE_LEFT) | 960 else if ((src->flags & PASTE_LEFT) |
| 939 || (src > macro->exp.tokens && (src[-1].flags & PASTE_LEFT))) | 961 || (src > macro->exp.tokens && (src[-1].flags & PASTE_LEFT))) |
| 940 total += arg->count - 1; | 962 total += arg->count - 1; |
| 941 else | 963 else |
| (...skipping 15 matching lines...) Expand all Loading... |
| 957 unsigned int count; | 979 unsigned int count; |
| 958 const cpp_token **from, **paste_flag; | 980 const cpp_token **from, **paste_flag; |
| 959 | 981 |
| 960 if (src->type != CPP_MACRO_ARG) | 982 if (src->type != CPP_MACRO_ARG) |
| 961 { | 983 { |
| 962 *dest++ = src; | 984 *dest++ = src; |
| 963 continue; | 985 continue; |
| 964 } | 986 } |
| 965 | 987 |
| 966 paste_flag = 0; | 988 paste_flag = 0; |
| 967 arg = &args[src->val.arg_no - 1]; | 989 arg = &args[src->val.macro_arg.arg_no - 1]; |
| 968 if (src->flags & STRINGIFY_ARG) | 990 if (src->flags & STRINGIFY_ARG) |
| 969 count = 1, from = &arg->stringified; | 991 count = 1, from = &arg->stringified; |
| 970 else if (src->flags & PASTE_LEFT) | 992 else if (src->flags & PASTE_LEFT) |
| 971 count = arg->count, from = arg->first; | 993 count = arg->count, from = arg->first; |
| 972 else if (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)) | 994 else if (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)) |
| 973 { | 995 { |
| 974 count = arg->count, from = arg->first; | 996 count = arg->count, from = arg->first; |
| 975 if (dest != first) | 997 if (dest != first) |
| 976 { | 998 { |
| 977 if (dest[-1]->type == CPP_COMMA | 999 if (dest[-1]->type == CPP_COMMA |
| 978 && macro->variadic | 1000 && macro->variadic |
| 979 » » && src->val.arg_no == macro->paramc) | 1001 » » && src->val.macro_arg.arg_no == macro->paramc) |
| 980 { | 1002 { |
| 981 /* Swallow a pasted comma if from == NULL, otherwise | 1003 /* Swallow a pasted comma if from == NULL, otherwise |
| 982 drop the paste flag. */ | 1004 drop the paste flag. */ |
| 983 if (from == NULL) | 1005 if (from == NULL) |
| 984 dest--; | 1006 dest--; |
| 985 else | 1007 else |
| 986 paste_flag = dest - 1; | 1008 paste_flag = dest - 1; |
| 987 } | 1009 } |
| 988 /* Remove the paste flag if the RHS is a placemarker. */ | 1010 /* Remove the paste flag if the RHS is a placemarker. */ |
| 989 else if (count == 0) | 1011 else if (count == 0) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1010 } | 1032 } |
| 1011 else if (CPP_PEDANTIC (pfile) && ! macro->syshdr | 1033 else if (CPP_PEDANTIC (pfile) && ! macro->syshdr |
| 1012 && ! CPP_OPTION (pfile, c99) | 1034 && ! CPP_OPTION (pfile, c99) |
| 1013 && ! cpp_in_system_header (pfile)) | 1035 && ! cpp_in_system_header (pfile)) |
| 1014 { | 1036 { |
| 1015 cpp_error (pfile, CPP_DL_PEDWARN, | 1037 cpp_error (pfile, CPP_DL_PEDWARN, |
| 1016 "invoking macro %s argument %d: " | 1038 "invoking macro %s argument %d: " |
| 1017 "empty macro arguments are undefined" | 1039 "empty macro arguments are undefined" |
| 1018 " in ISO C90 and ISO C++98", | 1040 " in ISO C90 and ISO C++98", |
| 1019 NODE_NAME (node), | 1041 NODE_NAME (node), |
| 1020 » » src->val.arg_no); | 1042 » » src->val.macro_arg.arg_no); |
| 1021 } | 1043 } |
| 1022 | 1044 |
| 1023 /* Avoid paste on RHS (even case count == 0). */ | 1045 /* Avoid paste on RHS (even case count == 0). */ |
| 1024 if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT)) | 1046 if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT)) |
| 1025 *dest++ = &pfile->avoid_paste; | 1047 *dest++ = &pfile->avoid_paste; |
| 1026 | 1048 |
| 1027 /* Add a new paste flag, or remove an unwanted one. */ | 1049 /* Add a new paste flag, or remove an unwanted one. */ |
| 1028 if (paste_flag) | 1050 if (paste_flag) |
| 1029 { | 1051 { |
| 1030 cpp_token *token = _cpp_temp_token (pfile); | 1052 cpp_token *token = _cpp_temp_token (pfile); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1236 continue; | 1258 continue; |
| 1237 return &pfile->avoid_paste; | 1259 return &pfile->avoid_paste; |
| 1238 } | 1260 } |
| 1239 | 1261 |
| 1240 if (pfile->state.in_directive && result->type == CPP_COMMENT) | 1262 if (pfile->state.in_directive && result->type == CPP_COMMENT) |
| 1241 continue; | 1263 continue; |
| 1242 | 1264 |
| 1243 if (result->type != CPP_NAME) | 1265 if (result->type != CPP_NAME) |
| 1244 break; | 1266 break; |
| 1245 | 1267 |
| 1246 node = result->val.node; | 1268 node = result->val.node.node; |
| 1247 | 1269 |
| 1248 if (node->type != NT_MACRO || (result->flags & NO_EXPAND)) | 1270 if (node->type != NT_MACRO || (result->flags & NO_EXPAND)) |
| 1249 break; | 1271 break; |
| 1250 | 1272 |
| 1251 if (!(node->flags & NODE_DISABLED)) | 1273 if (!(node->flags & NODE_DISABLED)) |
| 1252 { | 1274 { |
| 1253 int ret = 0; | 1275 int ret = 0; |
| 1254 /* If not in a macro context, and we're going to start an | 1276 /* If not in a macro context, and we're going to start an |
| 1255 expansion, record the location. */ | 1277 expansion, record the location. */ |
| 1256 if (can_set && !context->macro) | 1278 if (can_set && !context->macro) |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 | 1550 |
| 1529 case CPP_NAME: | 1551 case CPP_NAME: |
| 1530 if (prev_ident) | 1552 if (prev_ident) |
| 1531 { | 1553 { |
| 1532 cpp_error (pfile, CPP_DL_ERROR, | 1554 cpp_error (pfile, CPP_DL_ERROR, |
| 1533 "macro parameters must be comma-separated"); | 1555 "macro parameters must be comma-separated"); |
| 1534 return false; | 1556 return false; |
| 1535 } | 1557 } |
| 1536 prev_ident = 1; | 1558 prev_ident = 1; |
| 1537 | 1559 |
| 1538 » if (_cpp_save_parameter (pfile, macro, token->val.node)) | 1560 » if (_cpp_save_parameter (pfile, macro, token->val.node.node)) |
| 1539 return false; | 1561 return false; |
| 1540 continue; | 1562 continue; |
| 1541 | 1563 |
| 1542 case CPP_CLOSE_PAREN: | 1564 case CPP_CLOSE_PAREN: |
| 1543 if (prev_ident || macro->paramc == 0) | 1565 if (prev_ident || macro->paramc == 0) |
| 1544 return true; | 1566 return true; |
| 1545 | 1567 |
| 1546 /* Fall through to pick up the error. */ | 1568 /* Fall through to pick up the error. */ |
| 1547 case CPP_COMMA: | 1569 case CPP_COMMA: |
| 1548 if (!prev_ident) | 1570 if (!prev_ident) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1601 { | 1623 { |
| 1602 cpp_token *token, *saved_cur_token; | 1624 cpp_token *token, *saved_cur_token; |
| 1603 | 1625 |
| 1604 saved_cur_token = pfile->cur_token; | 1626 saved_cur_token = pfile->cur_token; |
| 1605 pfile->cur_token = alloc_expansion_token (pfile, macro); | 1627 pfile->cur_token = alloc_expansion_token (pfile, macro); |
| 1606 token = _cpp_lex_direct (pfile); | 1628 token = _cpp_lex_direct (pfile); |
| 1607 pfile->cur_token = saved_cur_token; | 1629 pfile->cur_token = saved_cur_token; |
| 1608 | 1630 |
| 1609 /* Is this a parameter? */ | 1631 /* Is this a parameter? */ |
| 1610 if (token->type == CPP_NAME | 1632 if (token->type == CPP_NAME |
| 1611 && (token->val.node->flags & NODE_MACRO_ARG) != 0) | 1633 && (token->val.node.node->flags & NODE_MACRO_ARG) != 0) |
| 1612 { | 1634 { |
| 1613 token->type = CPP_MACRO_ARG; | 1635 token->type = CPP_MACRO_ARG; |
| 1614 token->val.arg_no = token->val.node->value.arg_index; | 1636 token->val.macro_arg.arg_no = token->val.node.node->value.arg_index; |
| 1615 } | 1637 } |
| 1616 else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0 | 1638 else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0 |
| 1617 && (token->type == CPP_STRING || token->type == CPP_CHAR)) | 1639 && (token->type == CPP_STRING || token->type == CPP_CHAR)) |
| 1618 check_trad_stringification (pfile, macro, &token->val.str); | 1640 check_trad_stringification (pfile, macro, &token->val.str); |
| 1619 | 1641 |
| 1620 return token; | 1642 return token; |
| 1621 } | 1643 } |
| 1622 | 1644 |
| 1623 static bool | 1645 static bool |
| 1624 create_iso_definition (cpp_reader *pfile, cpp_macro *macro) | 1646 create_iso_definition (cpp_reader *pfile, cpp_macro *macro) |
| 1625 { | 1647 { |
| 1626 cpp_token *token; | 1648 cpp_token *token; |
| 1627 const cpp_token *ctoken; | 1649 const cpp_token *ctoken; |
| 1628 bool following_paste_op = false; | 1650 bool following_paste_op = false; |
| 1629 const char *paste_op_error_msg = | 1651 const char *paste_op_error_msg = |
| 1630 N_("'##' cannot appear at either end of a macro expansion"); | 1652 N_("'##' cannot appear at either end of a macro expansion"); |
| 1653 unsigned int num_extra_tokens = 0; |
| 1631 | 1654 |
| 1632 /* Get the first token of the expansion (or the '(' of a | 1655 /* Get the first token of the expansion (or the '(' of a |
| 1633 function-like macro). */ | 1656 function-like macro). */ |
| 1634 ctoken = _cpp_lex_token (pfile); | 1657 ctoken = _cpp_lex_token (pfile); |
| 1635 | 1658 |
| 1636 if (ctoken->type == CPP_OPEN_PAREN && !(ctoken->flags & PREV_WHITE)) | 1659 if (ctoken->type == CPP_OPEN_PAREN && !(ctoken->flags & PREV_WHITE)) |
| 1637 { | 1660 { |
| 1638 bool ok = parse_params (pfile, macro); | 1661 bool ok = parse_params (pfile, macro); |
| 1639 macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff); | 1662 macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff); |
| 1640 if (!ok) | 1663 if (!ok) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1698 } | 1721 } |
| 1699 | 1722 |
| 1700 for (;;) | 1723 for (;;) |
| 1701 { | 1724 { |
| 1702 /* Check the stringifying # constraint 6.10.3.2.1 of | 1725 /* Check the stringifying # constraint 6.10.3.2.1 of |
| 1703 function-like macros when lexing the subsequent token. */ | 1726 function-like macros when lexing the subsequent token. */ |
| 1704 if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like) | 1727 if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like) |
| 1705 { | 1728 { |
| 1706 if (token->type == CPP_MACRO_ARG) | 1729 if (token->type == CPP_MACRO_ARG) |
| 1707 { | 1730 { |
| 1731 if (token->flags & PREV_WHITE) |
| 1732 token->flags |= SP_PREV_WHITE; |
| 1733 if (token[-1].flags & DIGRAPH) |
| 1734 token->flags |= SP_DIGRAPH; |
| 1708 token->flags &= ~PREV_WHITE; | 1735 token->flags &= ~PREV_WHITE; |
| 1709 token->flags |= STRINGIFY_ARG; | 1736 token->flags |= STRINGIFY_ARG; |
| 1710 token->flags |= token[-1].flags & PREV_WHITE; | 1737 token->flags |= token[-1].flags & PREV_WHITE; |
| 1711 token[-1] = token[0]; | 1738 token[-1] = token[0]; |
| 1712 macro->count--; | 1739 macro->count--; |
| 1713 } | 1740 } |
| 1714 /* Let assembler get away with murder. */ | 1741 /* Let assembler get away with murder. */ |
| 1715 else if (CPP_OPTION (pfile, lang) != CLK_ASM) | 1742 else if (CPP_OPTION (pfile, lang) != CLK_ASM) |
| 1716 { | 1743 { |
| 1717 cpp_error (pfile, CPP_DL_ERROR, | 1744 cpp_error (pfile, CPP_DL_ERROR, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1737 if (token->type == CPP_PASTE) | 1764 if (token->type == CPP_PASTE) |
| 1738 { | 1765 { |
| 1739 /* Token-paste ##, can appear in both object-like and | 1766 /* Token-paste ##, can appear in both object-like and |
| 1740 function-like macros, but not at the beginning. */ | 1767 function-like macros, but not at the beginning. */ |
| 1741 if (macro->count == 1) | 1768 if (macro->count == 1) |
| 1742 { | 1769 { |
| 1743 cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); | 1770 cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); |
| 1744 return false; | 1771 return false; |
| 1745 } | 1772 } |
| 1746 | 1773 |
| 1747 » --macro->count; | 1774 » if (token[-1].flags & PASTE_LEFT) |
| 1748 » token[-1].flags |= PASTE_LEFT; | 1775 » { |
| 1776 » macro->extra_tokens = 1; |
| 1777 » num_extra_tokens++; |
| 1778 » token->val.token_no = macro->count - 1; |
| 1779 » } |
| 1780 » else |
| 1781 » { |
| 1782 » --macro->count; |
| 1783 » token[-1].flags |= PASTE_LEFT; |
| 1784 » if (token->flags & DIGRAPH) |
| 1785 » » token[-1].flags |= SP_DIGRAPH; |
| 1786 » if (token->flags & PREV_WHITE) |
| 1787 » » token[-1].flags |= SP_PREV_WHITE; |
| 1788 » } |
| 1749 } | 1789 } |
| 1750 | 1790 |
| 1751 following_paste_op = (token->type == CPP_PASTE); | 1791 following_paste_op = (token->type == CPP_PASTE); |
| 1752 token = lex_expansion_token (pfile, macro); | 1792 token = lex_expansion_token (pfile, macro); |
| 1753 } | 1793 } |
| 1754 | 1794 |
| 1755 macro->exp.tokens = (cpp_token *) BUFF_FRONT (pfile->a_buff); | 1795 macro->exp.tokens = (cpp_token *) BUFF_FRONT (pfile->a_buff); |
| 1756 macro->traditional = 0; | 1796 macro->traditional = 0; |
| 1757 | 1797 |
| 1758 /* Don't count the CPP_EOF. */ | 1798 /* Don't count the CPP_EOF. */ |
| 1759 macro->count--; | 1799 macro->count--; |
| 1760 | 1800 |
| 1761 /* Clear whitespace on first token for warn_of_redefinition(). */ | 1801 /* Clear whitespace on first token for warn_of_redefinition(). */ |
| 1762 if (macro->count) | 1802 if (macro->count) |
| 1763 macro->exp.tokens[0].flags &= ~PREV_WHITE; | 1803 macro->exp.tokens[0].flags &= ~PREV_WHITE; |
| 1764 | 1804 |
| 1765 /* Commit or allocate the memory. */ | 1805 /* Commit or allocate the memory. */ |
| 1766 if (pfile->hash_table->alloc_subobject) | 1806 if (pfile->hash_table->alloc_subobject) |
| 1767 { | 1807 { |
| 1768 cpp_token *tokns = | 1808 cpp_token *tokns = |
| 1769 (cpp_token *) pfile->hash_table->alloc_subobject (sizeof (cpp_token) | 1809 (cpp_token *) pfile->hash_table->alloc_subobject (sizeof (cpp_token) |
| 1770 * macro->count); | 1810 * macro->count); |
| 1771 memcpy (tokns, macro->exp.tokens, sizeof (cpp_token) * macro->count); | 1811 if (num_extra_tokens) |
| 1812 » { |
| 1813 » /* Place second and subsequent ## or %:%: tokens in |
| 1814 » sequences of consecutive such tokens at the end of the |
| 1815 » list to preserve information about where they appear, how |
| 1816 » they are spelt and whether they are preceded by |
| 1817 » whitespace without otherwise interfering with macro |
| 1818 » expansion. */ |
| 1819 » cpp_token *normal_dest = tokns; |
| 1820 » cpp_token *extra_dest = tokns + macro->count - num_extra_tokens; |
| 1821 » unsigned int i; |
| 1822 » for (i = 0; i < macro->count; i++) |
| 1823 » { |
| 1824 » if (macro->exp.tokens[i].type == CPP_PASTE) |
| 1825 » » *extra_dest++ = macro->exp.tokens[i]; |
| 1826 » else |
| 1827 » » *normal_dest++ = macro->exp.tokens[i]; |
| 1828 » } |
| 1829 » } |
| 1830 else |
| 1831 » memcpy (tokns, macro->exp.tokens, sizeof (cpp_token) * macro->count); |
| 1772 macro->exp.tokens = tokns; | 1832 macro->exp.tokens = tokns; |
| 1773 } | 1833 } |
| 1774 else | 1834 else |
| 1775 BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->exp.tokens[macro->count]; | 1835 BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->exp.tokens[macro->count]; |
| 1776 | 1836 |
| 1777 return true; | 1837 return true; |
| 1778 } | 1838 } |
| 1779 | 1839 |
| 1780 /* Parse a macro and save its expansion. Returns nonzero on success. */ | 1840 /* Parse a macro and save its expansion. Returns nonzero on success. */ |
| 1781 bool | 1841 bool |
| 1782 _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node) | 1842 _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node) |
| 1783 { | 1843 { |
| 1784 cpp_macro *macro; | 1844 cpp_macro *macro; |
| 1785 unsigned int i; | 1845 unsigned int i; |
| 1786 bool ok; | 1846 bool ok; |
| 1787 | 1847 |
| 1788 if (pfile->hash_table->alloc_subobject) | 1848 if (pfile->hash_table->alloc_subobject) |
| 1789 macro = (cpp_macro *) pfile->hash_table->alloc_subobject | 1849 macro = (cpp_macro *) pfile->hash_table->alloc_subobject |
| 1790 (sizeof (cpp_macro)); | 1850 (sizeof (cpp_macro)); |
| 1791 else | 1851 else |
| 1792 macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro)); | 1852 macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro)); |
| 1793 macro->line = pfile->directive_line; | 1853 macro->line = pfile->directive_line; |
| 1794 macro->params = 0; | 1854 macro->params = 0; |
| 1795 macro->paramc = 0; | 1855 macro->paramc = 0; |
| 1796 macro->variadic = 0; | 1856 macro->variadic = 0; |
| 1797 macro->used = !CPP_OPTION (pfile, warn_unused_macros); | 1857 macro->used = !CPP_OPTION (pfile, warn_unused_macros); |
| 1798 macro->count = 0; | 1858 macro->count = 0; |
| 1799 macro->fun_like = 0; | 1859 macro->fun_like = 0; |
| 1860 macro->extra_tokens = 0; |
| 1800 /* To suppress some diagnostics. */ | 1861 /* To suppress some diagnostics. */ |
| 1801 macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0; | 1862 macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0; |
| 1802 | 1863 |
| 1803 if (CPP_OPTION (pfile, traditional)) | 1864 if (CPP_OPTION (pfile, traditional)) |
| 1804 ok = _cpp_create_trad_definition (pfile, macro); | 1865 ok = _cpp_create_trad_definition (pfile, macro); |
| 1805 else | 1866 else |
| 1806 { | 1867 { |
| 1807 ok = create_iso_definition (pfile, macro); | 1868 ok = create_iso_definition (pfile, macro); |
| 1808 | 1869 |
| 1809 /* We set the type for SEEN_EOL() in directives.c. | 1870 /* We set the type for SEEN_EOL() in directives.c. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1826 if (!ok) | 1887 if (!ok) |
| 1827 return ok; | 1888 return ok; |
| 1828 | 1889 |
| 1829 if (node->type == NT_MACRO) | 1890 if (node->type == NT_MACRO) |
| 1830 { | 1891 { |
| 1831 if (CPP_OPTION (pfile, warn_unused_macros)) | 1892 if (CPP_OPTION (pfile, warn_unused_macros)) |
| 1832 _cpp_warn_if_unused_macro (pfile, node, NULL); | 1893 _cpp_warn_if_unused_macro (pfile, node, NULL); |
| 1833 | 1894 |
| 1834 if (warn_of_redefinition (pfile, node, macro)) | 1895 if (warn_of_redefinition (pfile, node, macro)) |
| 1835 { | 1896 { |
| 1836 » cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->directive_line, 0, | 1897 » bool warned; |
| 1837 » » » "\"%s\" redefined", NODE_NAME (node)); | 1898 » warned = cpp_error_with_line (pfile, CPP_DL_PEDWARN, |
| 1899 » » » » » pfile->directive_line, 0, |
| 1900 » » » » » "\"%s\" redefined", NODE_NAME (node)); |
| 1838 | 1901 |
| 1839 » if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) | 1902 » if (warned && node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) |
| 1840 » cpp_error_with_line (pfile, CPP_DL_PEDWARN, | 1903 » cpp_error_with_line (pfile, CPP_DL_NOTE, |
| 1841 node->value.macro->line, 0, | 1904 node->value.macro->line, 0, |
| 1842 "this is the location of the previous definition"); | 1905 "this is the location of the previous definition"); |
| 1843 } | 1906 } |
| 1844 } | 1907 } |
| 1845 | 1908 |
| 1846 if (node->type != NT_VOID) | 1909 if (node->type != NT_VOID) |
| 1847 _cpp_free_definition (node); | 1910 _cpp_free_definition (node); |
| 1848 | 1911 |
| 1849 /* Enter definition in hash table. */ | 1912 /* Enter definition in hash table. */ |
| 1850 node->type = NT_MACRO; | 1913 node->type = NT_MACRO; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1935 varargs (we have + 1 below). */ | 1998 varargs (we have + 1 below). */ |
| 1936 for (i = 0; i < macro->paramc; i++) | 1999 for (i = 0; i < macro->paramc; i++) |
| 1937 len += NODE_LEN (macro->params[i]) + 1; /* "," */ | 2000 len += NODE_LEN (macro->params[i]) + 1; /* "," */ |
| 1938 } | 2001 } |
| 1939 | 2002 |
| 1940 /* This should match below where we fill in the buffer. */ | 2003 /* This should match below where we fill in the buffer. */ |
| 1941 if (CPP_OPTION (pfile, traditional)) | 2004 if (CPP_OPTION (pfile, traditional)) |
| 1942 len += _cpp_replacement_text_len (macro); | 2005 len += _cpp_replacement_text_len (macro); |
| 1943 else | 2006 else |
| 1944 { | 2007 { |
| 1945 for (i = 0; i < macro->count; i++) | 2008 unsigned int count = macro_real_token_count (macro); |
| 2009 for (i = 0; i < count; i++) |
| 1946 { | 2010 { |
| 1947 cpp_token *token = ¯o->exp.tokens[i]; | 2011 cpp_token *token = ¯o->exp.tokens[i]; |
| 1948 | 2012 |
| 1949 if (token->type == CPP_MACRO_ARG) | 2013 if (token->type == CPP_MACRO_ARG) |
| 1950 » len += NODE_LEN (macro->params[token->val.arg_no - 1]); | 2014 » len += NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]); |
| 1951 else | 2015 else |
| 1952 len += cpp_token_len (token); | 2016 len += cpp_token_len (token); |
| 1953 | 2017 |
| 1954 if (token->flags & STRINGIFY_ARG) | 2018 if (token->flags & STRINGIFY_ARG) |
| 1955 len++; /* "#" */ | 2019 len++; /* "#" */ |
| 1956 if (token->flags & PASTE_LEFT) | 2020 if (token->flags & PASTE_LEFT) |
| 1957 len += 3; /* " ##" */ | 2021 len += 3; /* " ##" */ |
| 1958 if (token->flags & PREV_WHITE) | 2022 if (token->flags & PREV_WHITE) |
| 1959 len++; /* " " */ | 2023 len++; /* " " */ |
| 1960 } | 2024 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1999 | 2063 |
| 2000 /* The Dwarf spec requires a space after the macro name, even if the | 2064 /* The Dwarf spec requires a space after the macro name, even if the |
| 2001 definition is the empty string. */ | 2065 definition is the empty string. */ |
| 2002 *buffer++ = ' '; | 2066 *buffer++ = ' '; |
| 2003 | 2067 |
| 2004 if (CPP_OPTION (pfile, traditional)) | 2068 if (CPP_OPTION (pfile, traditional)) |
| 2005 buffer = _cpp_copy_replacement_text (macro, buffer); | 2069 buffer = _cpp_copy_replacement_text (macro, buffer); |
| 2006 else if (macro->count) | 2070 else if (macro->count) |
| 2007 /* Expansion tokens. */ | 2071 /* Expansion tokens. */ |
| 2008 { | 2072 { |
| 2009 for (i = 0; i < macro->count; i++) | 2073 unsigned int count = macro_real_token_count (macro); |
| 2074 for (i = 0; i < count; i++) |
| 2010 { | 2075 { |
| 2011 cpp_token *token = ¯o->exp.tokens[i]; | 2076 cpp_token *token = ¯o->exp.tokens[i]; |
| 2012 | 2077 |
| 2013 if (token->flags & PREV_WHITE) | 2078 if (token->flags & PREV_WHITE) |
| 2014 *buffer++ = ' '; | 2079 *buffer++ = ' '; |
| 2015 if (token->flags & STRINGIFY_ARG) | 2080 if (token->flags & STRINGIFY_ARG) |
| 2016 *buffer++ = '#'; | 2081 *buffer++ = '#'; |
| 2017 | 2082 |
| 2018 if (token->type == CPP_MACRO_ARG) | 2083 if (token->type == CPP_MACRO_ARG) |
| 2019 { | 2084 { |
| 2020 memcpy (buffer, | 2085 memcpy (buffer, |
| 2021 » » NODE_NAME (macro->params[token->val.arg_no - 1]), | 2086 » » NODE_NAME (macro->params[token->val.macro_arg.arg_no - 1])
, |
| 2022 » » NODE_LEN (macro->params[token->val.arg_no - 1])); | 2087 » » NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]))
; |
| 2023 » buffer += NODE_LEN (macro->params[token->val.arg_no - 1]); | 2088 » buffer += NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]
); |
| 2024 } | 2089 } |
| 2025 else | 2090 else |
| 2026 buffer = cpp_spell_token (pfile, token, buffer, false); | 2091 buffer = cpp_spell_token (pfile, token, buffer, false); |
| 2027 | 2092 |
| 2028 if (token->flags & PASTE_LEFT) | 2093 if (token->flags & PASTE_LEFT) |
| 2029 { | 2094 { |
| 2030 *buffer++ = ' '; | 2095 *buffer++ = ' '; |
| 2031 *buffer++ = '#'; | 2096 *buffer++ = '#'; |
| 2032 *buffer++ = '#'; | 2097 *buffer++ = '#'; |
| 2033 /* Next has PREV_WHITE; see _cpp_create_definition. */ | 2098 /* Next has PREV_WHITE; see _cpp_create_definition. */ |
| 2034 } | 2099 } |
| 2035 } | 2100 } |
| 2036 } | 2101 } |
| 2037 | 2102 |
| 2038 *buffer = '\0'; | 2103 *buffer = '\0'; |
| 2039 return pfile->macro_buffer; | 2104 return pfile->macro_buffer; |
| 2040 } | 2105 } |
| OLD | NEW |