2 * sparse/smatch_types.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 * The idea here is that you have an expression and you
12 * want to know what the type is for that.
17 static struct symbol
*get_type_symbol(struct expression
*expr
)
19 if (!expr
|| expr
->type
!= EXPR_SYMBOL
)
22 return get_base_type(expr
->symbol
);
26 static struct symbol
*get_symbol_from_deref(struct expression
*expr
)
29 struct symbol
*struct_sym
;
32 if (!expr
|| expr
->type
!= EXPR_DEREF
)
35 member
= expr
->member
;
36 struct_sym
= get_type(expr
->deref
);
38 // sm_msg("could not find struct type");
41 if (struct_sym
->type
== SYM_PTR
)
42 struct_sym
= get_base_type(struct_sym
);
43 FOR_EACH_PTR(struct_sym
->symbol_list
, tmp
) {
44 if (tmp
->ident
== member
)
45 return get_base_type(tmp
);
46 } END_FOR_EACH_PTR(tmp
);
50 static struct symbol
*get_return_type(struct expression
*expr
)
54 tmp
= get_type(expr
->fn
);
57 return get_base_type(tmp
);
60 static struct symbol
*fake_pointer_sym(struct expression
*expr
)
65 sym
= alloc_symbol(expr
->pos
, SYM_PTR
);
67 base
= get_type(expr
);
70 sym
->ctype
.base_type
= base
;
74 struct symbol
*get_type(struct expression
*expr
)
80 expr
= strip_expr(expr
);
84 return get_type_symbol(expr
);
86 return get_symbol_from_deref(expr
);
89 return fake_pointer_sym(expr
);
90 return get_type(expr
->unop
);
94 tmp
= get_type(expr
->left
);
95 if (!tmp
|| (tmp
->type
!= SYM_ARRAY
&& tmp
->type
!= SYM_PTR
))
97 return get_base_type(tmp
);
99 return get_return_type(expr
);
101 // sm_msg("unhandled type %d", expr->type);