| author | |
| committer | |
| log | eb65410b624d3aa8c56e7f2d2e68502030f8e981 |
| tree | 10ca4c149ed0918531b9e73cf7045fe224707e99 |
| parent | 62065a9aea1c3c93cfea617403b7d5dc8344e36a |
| signature |
See #24514 files changed, 37 insertions(+), 0 deletions(-)
src/c_tokenizer.cpp+19| ... | ... | @@ -124,6 +124,8 @@ static void begin_token(CTokenize *ctok, CTokId id) { |
| 124 | 124 | case CTokIdAsterisk: |
| 125 | 125 | case CTokIdBang: |
| 126 | 126 | case CTokIdTilde: |
| 127 | case CTokIdShl: | |
| 128 | case CTokIdLt: | |
| 127 | 129 | break; |
| 128 | 130 | } |
| 129 | 131 | } |
| ... | ... | @@ -223,6 +225,10 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { |
| 223 | 225 | begin_token(ctok, CTokIdDot); |
| 224 | 226 | end_token(ctok); |
| 225 | 227 | break; |
| 228 | case '<': | |
| 229 | begin_token(ctok, CTokIdLt); | |
| 230 | ctok->state = CTokStateGotLt; | |
| 231 | break; | |
| 226 | 232 | case '(': |
| 227 | 233 | begin_token(ctok, CTokIdLParen); |
| 228 | 234 | end_token(ctok); |
| ... | ... | @@ -251,6 +257,18 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { |
| 251 | 257 | return mark_error(ctok); |
| 252 | 258 | } |
| 253 | 259 | break; |
| 260 | case CTokStateGotLt: | |
| 261 | switch (*c) { | |
| 262 | case '<': | |
| 263 | ctok->cur_tok->id = CTokIdShl; | |
| 264 | end_token(ctok); | |
| 265 | ctok->state = CTokStateStart; | |
| 266 | break; | |
| 267 | default: | |
| 268 | ctok->state = CTokStateStart; | |
| 269 | continue; | |
| 270 | } | |
| 271 | break; | |
| 254 | 272 | case CTokStateFloat: |
| 255 | 273 | switch (*c) { |
| 256 | 274 | case '.': |
| ... | ... | @@ -791,6 +809,7 @@ found_end_of_macro: |
| 791 | 809 | case CTokStateNumLitIntSuffixL: |
| 792 | 810 | case CTokStateNumLitIntSuffixUL: |
| 793 | 811 | case CTokStateNumLitIntSuffixLL: |
| 812 | case CTokStateGotLt: | |
| 794 | 813 | end_token(ctok); |
| 795 | 814 | break; |
| 796 | 815 | case CTokStateFloat: |
src/c_tokenizer.hpp+3| ... | ... | @@ -25,6 +25,8 @@ enum CTokId { |
| 25 | 25 | CTokIdAsterisk, |
| 26 | 26 | CTokIdBang, |
| 27 | 27 | CTokIdTilde, |
| 28 | CTokIdShl, | |
| 29 | CTokIdLt, | |
| 28 | 30 | }; |
| 29 | 31 | |
| 30 | 32 | enum CNumLitSuffix { |
| ... | ... | @@ -78,6 +80,7 @@ enum CTokState { |
| 78 | 80 | CTokStateNumLitIntSuffixL, |
| 79 | 81 | CTokStateNumLitIntSuffixLL, |
| 80 | 82 | CTokStateNumLitIntSuffixUL, |
| 83 | CTokStateGotLt, | |
| 81 | 84 | }; |
| 82 | 85 | |
| 83 | 86 | struct CTokenize { |
src/translate_c.cpp+9| ... | ... | @@ -4922,6 +4922,8 @@ static AstNode *parse_ctok_primary_expr(Context *c, CTokenize *ctok, size_t *tok |
| 4922 | 4922 | case CTokIdAsterisk: |
| 4923 | 4923 | case CTokIdBang: |
| 4924 | 4924 | case CTokIdTilde: |
| 4925 | case CTokIdShl: | |
| 4926 | case CTokIdLt: | |
| 4925 | 4927 | // not able to make sense of this |
| 4926 | 4928 | return nullptr; |
| 4927 | 4929 | } |
| ... | ... | @@ -4953,6 +4955,13 @@ static AstNode *parse_ctok_suffix_op_expr(Context *c, CTokenize *ctok, size_t *t |
| 4953 | 4955 | *tok_i += 1; |
| 4954 | 4956 | |
| 4955 | 4957 | node = trans_create_node_ptr_type(c, false, false, node, PtrLenC); |
| 4958 | } else if (first_tok->id == CTokIdShl) { | |
| 4959 | *tok_i += 1; | |
| 4960 | ||
| 4961 | AstNode *rhs_node = parse_ctok_expr(c, ctok, tok_i); | |
| 4962 | if (rhs_node == nullptr) | |
| 4963 | return nullptr; | |
| 4964 | node = trans_create_node_bin_op(c, node, BinOpTypeBitShiftLeft, rhs_node); | |
| 4956 | 4965 | } else { |
| 4957 | 4966 | return node; |
| 4958 | 4967 | } |
test/translate_c.zig+6| ... | ... | @@ -2,6 +2,12 @@ const tests = @import("tests.zig"); |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | 3 | |
| 4 | 4 | pub fn addCases(cases: *tests.TranslateCContext) void { |
| 5 | cases.add("macro with left shift", | |
| 6 | \\#define REDISMODULE_READ (1<<0) | |
| 7 | , | |
| 8 | \\pub const REDISMODULE_READ = 1 << 0; | |
| 9 | ); | |
| 10 | ||
| 5 | 11 | cases.add("casting pointers to ints and ints to pointers", |
| 6 | 12 | \\void foo(void); |
| 7 | 13 | \\void bar(void) { |