4 * Copyright (C) 2003 Transmeta Corp.
5 * 2003-2004 Linus Torvalds
7 * Licensed under the Open Software License version 1.1
9 * This is the expression parsing part of parsing C.
27 #include "expression.h"
30 static int match_oplist(int op
, ...)
37 nextop
= va_arg(args
, int);
38 } while (nextop
!= 0 && nextop
!= op
);
44 static struct token
*comma_expression(struct token
*, struct expression
**);
46 struct token
*parens_expression(struct token
*token
, struct expression
**expr
, const char *where
)
48 token
= expect(token
, '(', where
);
49 if (match_op(token
, '{')) {
50 struct expression
*e
= alloc_expression(token
->pos
, EXPR_STATEMENT
);
51 struct statement
*stmt
= alloc_statement(token
->pos
, STMT_COMPOUND
);
54 start_symbol_scope(e
->pos
);
55 token
= compound_statement(token
->next
, stmt
);
57 token
= expect(token
, '}', "at end of statement expression");
59 token
= parse_expression(token
, expr
);
60 return expect(token
, ')', where
);
64 * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
67 static int convert_one_fn_token(struct token
*token
)
69 struct symbol
*sym
= current_fn
;
72 struct ident
*ident
= sym
->ident
;
75 struct string
*string
;
77 string
= __alloc_string(len
+1);
78 memcpy(string
->data
, ident
->name
, len
);
79 string
->data
[len
] = 0;
80 string
->length
= len
+1;
81 token_type(token
) = TOKEN_STRING
;
82 token
->string
= string
;
89 static int convert_function(struct token
*next
)
93 struct token
*token
= next
;
95 switch (token_type(token
)) {
99 if (token
->ident
== &__func___ident
||
100 token
->ident
== &__FUNCTION___ident
||
101 token
->ident
== &__PRETTY_FUNCTION___ident
) {
102 if (!convert_one_fn_token(token
))
116 static struct token
*parse_type(struct token
*token
, struct expression
**tree
)
119 *tree
= alloc_expression(token
->pos
, EXPR_TYPE
);
120 (*tree
)->flags
= Int_const_expr
; /* sic */
121 token
= typename(token
, &sym
, NULL
);
123 sparse_error(token
->pos
,
124 "type expression should not include identifier "
125 "\"%s\"", sym
->ident
->name
);
126 (*tree
)->symbol
= sym
;
130 static struct token
*builtin_types_compatible_p_expr(struct token
*token
,
131 struct expression
**tree
)
133 struct expression
*expr
= alloc_expression(
134 token
->pos
, EXPR_COMPARE
);
135 expr
->flags
= Int_const_expr
;
136 expr
->op
= SPECIAL_EQUAL
;
138 if (!match_op(token
, '('))
139 return expect(token
, '(',
140 "after __builtin_types_compatible_p");
142 token
= parse_type(token
, &expr
->left
);
143 if (!match_op(token
, ','))
144 return expect(token
, ',',
145 "in __builtin_types_compatible_p");
147 token
= parse_type(token
, &expr
->right
);
148 if (!match_op(token
, ')'))
149 return expect(token
, ')',
150 "at end of __builtin_types_compatible_p");
157 static struct token
*builtin_offsetof_expr(struct token
*token
,
158 struct expression
**tree
)
160 struct expression
*expr
= NULL
;
161 struct expression
**p
= &expr
;
166 if (!match_op(token
, '('))
167 return expect(token
, '(', "after __builtin_offset");
170 token
= typename(token
, &sym
, NULL
);
172 sparse_error(token
->pos
,
173 "type expression should not include identifier "
174 "\"%s\"", sym
->ident
->name
);
176 if (!match_op(token
, ','))
177 return expect(token
, ',', "in __builtin_offset");
180 struct expression
*e
;
186 return expect(token
, ')', "at end of __builtin_offset");
187 case SPECIAL_DEREFERENCE
:
188 e
= alloc_expression(token
->pos
, EXPR_OFFSETOF
);
189 e
->flags
= Int_const_expr
;
196 e
= alloc_expression(token
->pos
, EXPR_OFFSETOF
);
197 e
->flags
= Int_const_expr
;
199 if (token_type(token
) != TOKEN_IDENT
) {
200 sparse_error(token
->pos
, "Expected member name");
203 e
->ident
= token
->ident
;
208 e
= alloc_expression(token
->pos
, EXPR_OFFSETOF
);
209 e
->flags
= Int_const_expr
;
211 token
= parse_expression(token
, &e
->index
);
212 token
= expect(token
, ']',
213 "at end of array dereference");
219 op
= token_type(token
) == TOKEN_SPECIAL
? token
->special
: 0;
223 static struct token
*string_expression(struct token
*token
, struct expression
*expr
)
225 struct string
*string
= token
->string
;
226 struct token
*next
= token
->next
;
227 int stringtype
= token_type(token
);
229 convert_function(token
);
231 if (token_type(next
) == stringtype
) {
232 int totlen
= string
->length
-1;
236 totlen
+= next
->string
->length
-1;
238 } while (token_type(next
) == stringtype
);
240 if (totlen
> MAX_STRING
) {
241 warning(token
->pos
, "trying to concatenate %d-character string (%d bytes max)", totlen
, MAX_STRING
);
245 string
= __alloc_string(totlen
+1);
246 string
->length
= totlen
+1;
250 struct string
*s
= next
->string
;
251 int len
= s
->length
-1;
258 memcpy(data
, s
->data
, len
);
260 } while (token_type(next
) == stringtype
);
263 expr
->string
= string
;
268 #define ULLONG_MAX (~0ULL)
271 static unsigned long long parse_num(const char *nptr
, char **end
)
273 if (nptr
[0] == '0' && tolower(nptr
[1]) == 'b')
274 return strtoull(&nptr
[2], end
, 2);
275 return strtoull(nptr
, end
, 0);
278 static void get_number_value(struct expression
*expr
, struct token
*token
)
280 const char *str
= token
->number
;
281 unsigned long long value
;
283 int size
= 0, want_unsigned
= 0;
284 int overflow
= 0, do_warn
= 0;
285 int try_unsigned
= 1;
289 value
= parse_num(str
, &end
);
292 if (value
== ULLONG_MAX
&& errno
== ERANGE
)
298 } else if (c
== 'u' || c
== 'U') {
302 } else if (c
== 'l' || c
== 'L') {
315 /* OK, it's a valid integer */
316 /* decimals can be unsigned only if directly specified as such */
317 if (str
[0] != '0' && !want_unsigned
)
320 bits
= bits_in_int
- 1;
321 if (!(value
& (~1ULL << bits
))) {
322 if (!(value
& (1ULL << bits
))) {
324 } else if (try_unsigned
) {
333 bits
= bits_in_long
- 1;
334 if (!(value
& (~1ULL << bits
))) {
335 if (!(value
& (1ULL << bits
))) {
337 } else if (try_unsigned
) {
346 bits
= bits_in_longlong
- 1;
347 if (value
& (~1ULL << bits
))
349 if (!(value
& (1ULL << bits
)))
352 warning(expr
->pos
, "decimal constant %s is too big for long long",
357 warning(expr
->pos
, "constant %s is so big it is%s%s%s",
359 want_unsigned
? " unsigned":"",
360 size
> 0 ? " long":"",
361 size
> 1 ? " long":"");
364 "decimal constant %s is between LONG_MAX and ULONG_MAX."
365 " For C99 that means long long, C90 compilers are very "
366 "likely to produce unsigned long (and a warning) here",
368 expr
->type
= EXPR_VALUE
;
369 expr
->flags
= Int_const_expr
;
370 expr
->ctype
= ctype_integer(size
, want_unsigned
);
374 error_die(expr
->pos
, "constant %s is too big even for unsigned long long",
378 expr
->fvalue
= string_to_ld(str
, &end
);
385 if (*end
== 'f' || *end
== 'F')
386 expr
->ctype
= &float_ctype
;
387 else if (*end
== 'l' || *end
== 'L')
388 expr
->ctype
= &ldouble_ctype
;
390 expr
->ctype
= &double_ctype
;
394 expr
->flags
= Float_literal
;
395 expr
->type
= EXPR_FVALUE
;
399 error_die(expr
->pos
, "constant %s is not a valid number", show_token(token
));
402 struct token
*primary_expression(struct token
*token
, struct expression
**tree
)
404 struct expression
*expr
= NULL
;
406 switch (token_type(token
)) {
408 case TOKEN_WIDE_CHAR
:
409 expr
= alloc_expression(token
->pos
, EXPR_VALUE
);
410 expr
->flags
= Int_const_expr
;
411 expr
->ctype
= token_type(token
) == TOKEN_CHAR
? &int_ctype
: &long_ctype
;
412 expr
->value
= (unsigned char) token
->character
;
417 expr
= alloc_expression(token
->pos
, EXPR_VALUE
);
418 get_number_value(expr
, token
); /* will see if it's an integer */
422 case TOKEN_ZERO_IDENT
: {
423 expr
= alloc_expression(token
->pos
, EXPR_SYMBOL
);
424 expr
->flags
= Int_const_expr
;
425 expr
->ctype
= &int_ctype
;
426 expr
->symbol
= &zero_int
;
427 expr
->symbol_name
= token
->ident
;
433 struct symbol
*sym
= lookup_symbol(token
->ident
, NS_SYMBOL
| NS_TYPEDEF
);
434 struct token
*next
= token
->next
;
437 if (convert_function(token
))
439 if (token
->ident
== &__builtin_types_compatible_p_ident
) {
440 token
= builtin_types_compatible_p_expr(token
, &expr
);
443 if (token
->ident
== &__builtin_offsetof_ident
) {
444 token
= builtin_offsetof_expr(token
, &expr
);
447 } else if (sym
->enum_member
) {
448 expr
= alloc_expression(token
->pos
, EXPR_VALUE
);
449 *expr
= *sym
->initializer
;
450 /* we want the right position reported, thus the copy */
451 expr
->pos
= token
->pos
;
452 expr
->flags
= Int_const_expr
;
457 expr
= alloc_expression(token
->pos
, EXPR_SYMBOL
);
460 * We support types as real first-class citizens, with type
463 * if (typeof(a) == int) ..
465 if (sym
&& sym
->namespace == NS_TYPEDEF
) {
466 sparse_error(token
->pos
, "typename in expression");
469 expr
->symbol_name
= token
->ident
;
476 case TOKEN_WIDE_STRING
: {
478 expr
= alloc_expression(token
->pos
, EXPR_STRING
);
479 expr
->wide
= token_type(token
) == TOKEN_WIDE_STRING
;
480 token
= string_expression(token
, expr
);
485 if (token
->special
== '(') {
486 expr
= alloc_expression(token
->pos
, EXPR_PREOP
);
488 token
= parens_expression(token
, &expr
->unop
, "in expression");
490 expr
->flags
= expr
->unop
->flags
;
493 if (token
->special
== '[' && lookup_type(token
->next
)) {
494 expr
= alloc_expression(token
->pos
, EXPR_TYPE
);
495 expr
->flags
= Int_const_expr
; /* sic */
496 token
= typename(token
->next
, &expr
->symbol
, NULL
);
497 token
= expect(token
, ']', "in type expression");
508 static struct token
*expression_list(struct token
*token
, struct expression_list
**list
)
510 while (!match_op(token
, ')')) {
511 struct expression
*expr
= NULL
;
512 token
= assignment_expression(token
, &expr
);
515 add_expression(list
, expr
);
516 if (!match_op(token
, ','))
524 * extend to deal with the ambiguous C grammar for parsing
525 * a cast expressions followed by an initializer.
527 static struct token
*postfix_expression(struct token
*token
, struct expression
**tree
, struct expression
*cast_init_expr
)
529 struct expression
*expr
= cast_init_expr
;
532 token
= primary_expression(token
, &expr
);
534 while (expr
&& token_type(token
) == TOKEN_SPECIAL
) {
535 switch (token
->special
) {
536 case '[': { /* Array dereference */
537 struct expression
*deref
= alloc_expression(token
->pos
, EXPR_PREOP
);
538 struct expression
*add
= alloc_expression(token
->pos
, EXPR_BINOP
);
545 token
= parse_expression(token
->next
, &add
->right
);
546 token
= expect(token
, ']', "at end of array dereference");
550 case SPECIAL_INCREMENT
: /* Post-increment */
551 case SPECIAL_DECREMENT
: { /* Post-decrement */
552 struct expression
*post
= alloc_expression(token
->pos
, EXPR_POSTOP
);
553 post
->op
= token
->special
;
559 case SPECIAL_DEREFERENCE
: { /* Structure pointer member dereference */
560 /* "x->y" is just shorthand for "(*x).y" */
561 struct expression
*inner
= alloc_expression(token
->pos
, EXPR_PREOP
);
567 case '.': { /* Structure member dereference */
568 struct expression
*deref
= alloc_expression(token
->pos
, EXPR_DEREF
);
572 if (token_type(token
) != TOKEN_IDENT
) {
573 sparse_error(token
->pos
, "Expected member name");
576 deref
->member
= token
->ident
;
582 case '(': { /* Function call */
583 struct expression
*call
= alloc_expression(token
->pos
, EXPR_CALL
);
586 token
= expression_list(token
->next
, &call
->args
);
587 token
= expect(token
, ')', "in function call");
601 static struct token
*cast_expression(struct token
*token
, struct expression
**tree
);
602 static struct token
*unary_expression(struct token
*token
, struct expression
**tree
);
604 static struct token
*type_info_expression(struct token
*token
,
605 struct expression
**tree
, int type
)
607 struct expression
*expr
= alloc_expression(token
->pos
, type
);
611 expr
->flags
= Int_const_expr
; /* XXX: VLA support will need that changed */
613 if (!match_op(token
, '(') || !lookup_type(token
->next
))
614 return unary_expression(token
, &expr
->cast_expression
);
616 token
= typename(token
->next
, &expr
->cast_type
, NULL
);
618 if (!match_op(token
, ')')) {
619 static const char * error
[] = {
620 [EXPR_SIZEOF
] = "at end of sizeof",
621 [EXPR_ALIGNOF
] = "at end of __alignof__",
622 [EXPR_PTRSIZEOF
] = "at end of __sizeof_ptr__"
624 return expect(token
, ')', error
[type
]);
629 * C99 ambiguity: the typename might have been the beginning
630 * of a typed initializer expression..
632 if (match_op(token
, '{')) {
633 struct expression
*cast
= alloc_expression(p
->pos
, EXPR_CAST
);
634 cast
->cast_type
= expr
->cast_type
;
635 expr
->cast_type
= NULL
;
636 expr
->cast_expression
= cast
;
637 token
= initializer(&cast
->cast_expression
, token
);
638 token
= postfix_expression(token
, &expr
->cast_expression
, cast
);
643 static struct token
*unary_expression(struct token
*token
, struct expression
**tree
)
645 if (token_type(token
) == TOKEN_IDENT
) {
646 struct ident
*ident
= token
->ident
;
647 if (ident
->reserved
) {
648 static const struct {
651 } type_information
[] = {
652 { &sizeof_ident
, EXPR_SIZEOF
},
653 { &__alignof___ident
, EXPR_ALIGNOF
},
654 { &__alignof_ident
, EXPR_ALIGNOF
},
655 { &__sizeof_ptr___ident
, EXPR_PTRSIZEOF
},
658 for (i
= 0; i
< 3; i
++) {
659 if (ident
== type_information
[i
].id
)
660 return type_info_expression(token
, tree
, type_information
[i
].type
);
665 if (token_type(token
) == TOKEN_SPECIAL
) {
666 if (match_oplist(token
->special
,
667 SPECIAL_INCREMENT
, SPECIAL_DECREMENT
,
669 struct expression
*unop
;
670 struct expression
*unary
;
673 next
= cast_expression(token
->next
, &unop
);
675 sparse_error(token
->pos
, "Syntax error in unary expression");
679 unary
= alloc_expression(token
->pos
, EXPR_PREOP
);
680 unary
->op
= token
->special
;
685 /* possibly constant ones */
686 if (match_oplist(token
->special
, '+', '-', '~', '!', 0)) {
687 struct expression
*unop
;
688 struct expression
*unary
;
691 next
= cast_expression(token
->next
, &unop
);
693 sparse_error(token
->pos
, "Syntax error in unary expression");
697 unary
= alloc_expression(token
->pos
, EXPR_PREOP
);
698 unary
->op
= token
->special
;
700 unary
->flags
= unop
->flags
& Int_const_expr
;
704 /* Gcc extension: &&label gives the address of a label */
705 if (match_op(token
, SPECIAL_LOGICAL_AND
) &&
706 token_type(token
->next
) == TOKEN_IDENT
) {
707 struct expression
*label
= alloc_expression(token
->pos
, EXPR_LABEL
);
708 struct symbol
*sym
= label_symbol(token
->next
);
709 if (!(sym
->ctype
.modifiers
& MOD_ADDRESSABLE
)) {
710 sym
->ctype
.modifiers
|= MOD_ADDRESSABLE
;
711 add_symbol(&function_computed_target_list
, sym
);
713 label
->label_symbol
= sym
;
715 return token
->next
->next
;
720 return postfix_expression(token
, tree
, NULL
);
724 * Ambiguity: a '(' can be either a cast-expression or
725 * a primary-expression depending on whether it is followed
728 * additional ambiguity: a "cast expression" followed by
729 * an initializer is really a postfix-expression.
731 static struct token
*cast_expression(struct token
*token
, struct expression
**tree
)
733 if (match_op(token
, '(')) {
734 struct token
*next
= token
->next
;
735 if (lookup_type(next
)) {
736 struct expression
*cast
= alloc_expression(next
->pos
, EXPR_CAST
);
737 struct expression
*v
;
741 token
= typename(next
, &sym
, &is_force
);
742 cast
->cast_type
= sym
;
743 token
= expect(token
, ')', "at end of cast operator");
744 if (match_op(token
, '{')) {
747 "[force] in compound literal");
748 token
= initializer(&cast
->cast_expression
, token
);
749 return postfix_expression(token
, tree
, cast
);
753 cast
->type
= EXPR_FORCE_CAST
;
754 token
= cast_expression(token
, &v
);
757 cast
->cast_expression
= v
;
758 if (v
->flags
& Int_const_expr
)
759 cast
->flags
= Int_const_expr
;
760 else if (v
->flags
& Float_literal
) /* and _not_ int */
761 cast
->flags
= Int_const_expr
| Float_literal
;
765 return unary_expression(token
, tree
);
769 * Generic left-to-right binop parsing
771 * This _really_ needs to be inlined, because that makes the inner
772 * function call statically deterministic rather than a totally
773 * unpredictable indirect call. But gcc-3 is so "clever" that it
774 * doesn't do so by default even when you tell it to inline it.
776 * Making it a macro avoids the inlining problem, and also means
777 * that we can pass in the op-comparison as an expression rather
778 * than create a data structure for it.
781 #define LR_BINOP_EXPRESSION(__token, tree, type, inner, compare) \
782 struct expression *left = NULL; \
783 struct token * next = inner(__token, &left); \
786 while (token_type(next) == TOKEN_SPECIAL) { \
787 struct expression *top, *right = NULL; \
788 int op = next->special; \
792 top = alloc_expression(next->pos, type); \
793 next = inner(next->next, &right); \
795 sparse_error(next->pos, "No right hand side of '%s'-expression", show_special(op)); \
798 top->flags = left->flags & right->flags \
802 top->right = right; \
810 static struct token *multiplicative_expression(struct token *token, struct expression **tree)
813 token
, tree
, EXPR_BINOP
, cast_expression
,
814 (op
== '*') || (op
== '/') || (op
== '%')
818 static struct token
*additive_expression(struct token
*token
, struct expression
**tree
)
821 token
, tree
, EXPR_BINOP
, multiplicative_expression
,
822 (op
== '+') || (op
== '-')
826 static struct token
*shift_expression(struct token
*token
, struct expression
**tree
)
829 token
, tree
, EXPR_BINOP
, additive_expression
,
830 (op
== SPECIAL_LEFTSHIFT
) || (op
== SPECIAL_RIGHTSHIFT
)
834 static struct token
*relational_expression(struct token
*token
, struct expression
**tree
)
837 token
, tree
, EXPR_COMPARE
, shift_expression
,
838 (op
== '<') || (op
== '>') ||
839 (op
== SPECIAL_LTE
) || (op
== SPECIAL_GTE
)
843 static struct token
*equality_expression(struct token
*token
, struct expression
**tree
)
846 token
, tree
, EXPR_COMPARE
, relational_expression
,
847 (op
== SPECIAL_EQUAL
) || (op
== SPECIAL_NOTEQUAL
)
851 static struct token
*bitwise_and_expression(struct token
*token
, struct expression
**tree
)
854 token
, tree
, EXPR_BINOP
, equality_expression
,
859 static struct token
*bitwise_xor_expression(struct token
*token
, struct expression
**tree
)
862 token
, tree
, EXPR_BINOP
, bitwise_and_expression
,
867 static struct token
*bitwise_or_expression(struct token
*token
, struct expression
**tree
)
870 token
, tree
, EXPR_BINOP
, bitwise_xor_expression
,
875 static struct token
*logical_and_expression(struct token
*token
, struct expression
**tree
)
878 token
, tree
, EXPR_LOGICAL
, bitwise_or_expression
,
879 (op
== SPECIAL_LOGICAL_AND
)
883 static struct token
*logical_or_expression(struct token
*token
, struct expression
**tree
)
886 token
, tree
, EXPR_LOGICAL
, logical_and_expression
,
887 (op
== SPECIAL_LOGICAL_OR
)
891 struct token
*conditional_expression(struct token
*token
, struct expression
**tree
)
893 token
= logical_or_expression(token
, tree
);
894 if (*tree
&& match_op(token
, '?')) {
895 struct expression
*expr
= alloc_expression(token
->pos
, EXPR_CONDITIONAL
);
896 expr
->op
= token
->special
;
899 token
= parse_expression(token
->next
, &expr
->cond_true
);
900 token
= expect(token
, ':', "in conditional expression");
901 token
= conditional_expression(token
, &expr
->cond_false
);
902 if (expr
->left
&& expr
->cond_false
) {
903 int is_const
= expr
->left
->flags
&
904 expr
->cond_false
->flags
&
907 is_const
&= expr
->cond_true
->flags
;
908 expr
->flags
= is_const
;
914 struct token
*assignment_expression(struct token
*token
, struct expression
**tree
)
916 token
= conditional_expression(token
, tree
);
917 if (*tree
&& token_type(token
) == TOKEN_SPECIAL
) {
918 static const int assignments
[] = {
920 SPECIAL_ADD_ASSIGN
, SPECIAL_SUB_ASSIGN
,
921 SPECIAL_MUL_ASSIGN
, SPECIAL_DIV_ASSIGN
,
922 SPECIAL_MOD_ASSIGN
, SPECIAL_SHL_ASSIGN
,
923 SPECIAL_SHR_ASSIGN
, SPECIAL_AND_ASSIGN
,
924 SPECIAL_OR_ASSIGN
, SPECIAL_XOR_ASSIGN
};
925 int i
, op
= token
->special
;
926 for (i
= 0; i
< ARRAY_SIZE(assignments
); i
++)
927 if (assignments
[i
] == op
) {
928 struct expression
* expr
= alloc_expression(token
->pos
, EXPR_ASSIGNMENT
);
932 return assignment_expression(token
->next
, &expr
->right
);
938 static struct token
*comma_expression(struct token
*token
, struct expression
**tree
)
941 token
, tree
, EXPR_COMMA
, assignment_expression
,
946 struct token
*parse_expression(struct token
*token
, struct expression
**tree
)
948 return comma_expression(token
,tree
);