This let the macro expands to its value as gint64/guint64.
Also
- fix lexer identifier/typdef detection for macro and misc
- do not discard cast
"__typeof" { if (!parse_ignored_macro()) REJECT; }
"_Bool" { return BOOL; }
-[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return IDENTIFIER; else REJECT; }
+"G_GINT64_CONSTANT" { return INTL_CONST; }
+"G_GUINT64_CONSTANT" { return INTUL_CONST; }
+[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return check_identifier(scanner, yytext); else REJECT; }
"asm" { if (!parse_ignored_macro()) REJECT; }
"auto" { return AUTO; }
%token INTEGER FLOATING CHARACTER STRING
+%token INTL_CONST INTUL_CONST
%token ELLIPSIS ADDEQ SUBEQ MULEQ DIVEQ MODEQ XOREQ ANDEQ OREQ SL SR
%token SLEQ SREQ EQ NOTEQ LTEQ GTEQ ANDAND OROR PLUSPLUS MINUSMINUS ARROW
break;
}
}
+ | INTL_CONST '(' unary_expression ')'
+ {
+ $$ = $3;
+ if ($$->const_int_set) {
+ $$->base_type = gi_source_basic_type_new ("gint64");
+ }
+ }
+ | INTUL_CONST '(' unary_expression ')'
+ {
+ $$ = $3;
+ if ($$->const_int_set) {
+ $$->base_type = gi_source_basic_type_new ("guint64");
+ }
+ }
| SIZEOF unary_expression
{
$$ = gi_source_symbol_new (CSYMBOL_TYPE_INVALID, scanner->current_filename, lineno);
: unary_expression
| '(' type_name ')' cast_expression
{
- ctype_free ($2);
$$ = $4;
+ if ($$->const_int_set || $$->const_double_set || $$->const_string != NULL) {
+ $$->base_type = $2;
+ } else {
+ ctype_free ($2);
+ }
}
;
conditional_expression
: logical_or_expression
- | logical_or_expression '?' expression ':' conditional_expression
+ | logical_or_expression '?' expression ':' expression
{
$$ = gi_source_symbol_get_const_boolean ($1) ? $3 : $5;
}
typeval = ast.TYPE_STRING
value = unicode(symbol.const_string, 'utf-8')
elif symbol.const_int is not None:
- typeval = ast.TYPE_INT
+ if symbol.base_type is not None:
+ typeval = self._create_type_from_base(symbol.base_type)
+ else:
+ typeval = ast.TYPE_INT
value = '%d' % (symbol.const_int, )
elif symbol.const_double is not None:
typeval = ast.TYPE_DOUBLE
c:type="REGRESS_DOUBLE_CONSTANT">
<type name="gdouble" c:type="gdouble"/>
</constant>
+ <constant name="G_GINT64_CONSTANT"
+ value="1000"
+ c:type="REGRESS_G_GINT64_CONSTANT">
+ <type name="gint64" c:type="gint64"/>
+ </constant>
<constant name="INT_CONSTANT" value="4422" c:type="REGRESS_INT_CONSTANT">
<type name="gint" c:type="gint"/>
</constant>
#define REGRESS_DOUBLE_CONSTANT 44.22
#define REGRESS_STRING_CONSTANT "Some String"
#define REGRESS_Mixed_Case_Constant 4423
+#define REGRESS_G_GINT64_CONSTANT (G_GINT64_CONSTANT (1000))
/* structures */
typedef struct _RegressTestStructA RegressTestStructA;