summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gmail.com>2018-02-09 14:29:28 +0000
committerEmmanuele Bassi <ebassi@gmail.com>2018-02-09 14:29:28 +0000
commit9e07482a09231fbf5740591056333b719c0a3a8c (patch)
treeb59879024814b5f7a131ccb9c29aaed8964c0cb1
parent4f7a66a42c3897d986aff5d6d081d1ecb6af0ade (diff)
parentaebda1c0868dfadfa8ccb55f4edfb40b16e80635 (diff)
downloadgobject-introspection-9e07482a09231fbf5740591056333b719c0a3a8c.tar.gz
Merge branch 'type-specifier-qualifier-order' into 'master'
Fix parsing when type_specifier comes before type_qualifier. See merge request GNOME/gobject-introspection!6
-rw-r--r--giscanner/scannerparser.y27
-rw-r--r--tests/scanner/regress.c2
-rw-r--r--tests/scanner/regress.h2
3 files changed, 27 insertions, 4 deletions
diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y
index d9490b00..2735f5f4 100644
--- a/giscanner/scannerparser.y
+++ b/giscanner/scannerparser.y
@@ -206,6 +206,29 @@ toggle_conditional (GISourceScanner *scanner)
}
}
+static void
+set_or_merge_base_type (GISourceType *type,
+ GISourceType *base)
+{
+ if (base->type == CTYPE_INVALID)
+ {
+ g_assert (base->base_type == NULL);
+
+ type->storage_class_specifier |= base->storage_class_specifier;
+ type->type_qualifier |= base->type_qualifier;
+ type->function_specifier |= base->function_specifier;
+ type->is_bitfield |= base->is_bitfield;
+
+ ctype_free (base);
+ }
+ else
+ {
+ g_assert (type->base_type == NULL);
+
+ type->base_type = base;
+ }
+}
+
%}
%error-verbose
@@ -786,7 +809,7 @@ declaration_specifiers
$$->name = name;
ctype_free ($2);
} else {
- $$->base_type = $2;
+ set_or_merge_base_type ($1, $2);
}
}
| type_specifier
@@ -983,7 +1006,7 @@ specifier_qualifier_list
: type_specifier specifier_qualifier_list
{
$$ = $1;
- $$->base_type = $2;
+ set_or_merge_base_type ($1, $2);
}
| type_specifier
| type_qualifier specifier_qualifier_list
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 92bf6c4e..85e00d9b 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -4294,7 +4294,7 @@ regress_test_versioning (void)
void
regress_like_xkl_config_item_set_name (RegressLikeXklConfigItem *self,
- const char *name)
+ char const *name)
{
strncpy (self->name, name, sizeof (self->name) - 1);
self->name[sizeof(self->name)-1] = '\0';
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index 7f315fdc..cf0059e4 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -1398,7 +1398,7 @@ typedef struct {
_GI_TEST_EXTERN
void regress_like_xkl_config_item_set_name (RegressLikeXklConfigItem *self,
- const char *name);
+ char const *name);
#define REGRESS_UTF8_CONSTANT "const \xe2\x99\xa5 utf8"