diff options
author | Benjamin Otte <otte@redhat.com> | 2017-10-17 00:55:06 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2017-10-30 02:58:03 +0100 |
commit | d17abee4ebdbd1ebffe02b941c5d96dbceaeaf31 (patch) | |
tree | ef224ae158bb23d5b3bfbc822178cc48a91a0c51 | |
parent | 8a59adedfc0168a1d7116922816e569308e889f2 (diff) | |
download | gtk+-d17abee4ebdbd1ebffe02b941c5d96dbceaeaf31.tar.gz |
gsksldeclaration: Correctly parse initializers
And store them as initializers for later.
-rw-r--r-- | gsk/gsksldeclaration.c | 18 | ||||
-rw-r--r-- | testsuite/gsksl/errors/initialize-global-const.frag | 6 | ||||
-rw-r--r-- | testsuite/gsksl/errors/initialize-local-const.frag | 5 |
3 files changed, 26 insertions, 3 deletions
diff --git a/gsk/gsksldeclaration.c b/gsk/gsksldeclaration.c index 9a85dc8781..68948647f7 100644 --- a/gsk/gsksldeclaration.c +++ b/gsk/gsksldeclaration.c @@ -28,6 +28,7 @@ #include "gsksltokenizerprivate.h" #include "gsksltypeprivate.h" #include "gskslqualifierprivate.h" +#include "gskslvalueprivate.h" #include "gskslvariableprivate.h" #include "gskspvwriterprivate.h" @@ -221,13 +222,13 @@ gsk_sl_declaration_parse_variable (GskSlScope *scope, const char *name) { GskSlDeclarationVariable *variable; + GskSlValue *initial_value = NULL; + GskSlExpression *initial = NULL; const GskSlToken *token; token = gsk_sl_preprocessor_get (preproc); if (gsk_sl_token_is (token, GSK_SL_TOKEN_EQUAL)) { - GskSlExpression *initial; - gsk_sl_preprocessor_consume (preproc, NULL); initial = gsk_sl_expression_parse_assignment (scope, preproc); @@ -239,6 +240,16 @@ gsk_sl_declaration_parse_variable (GskSlScope *scope, gsk_sl_type_get_name (gsk_sl_expression_get_return_type (initial)), gsk_sl_type_get_name (type)); gsk_sl_expression_unref (initial); + initial = NULL; + } + else + { + GskSlValue *unconverted = gsk_sl_expression_get_constant (initial); + if (unconverted) + { + initial_value = gsk_sl_value_new_convert (unconverted, type); + gsk_sl_value_free (unconverted); + } } token = gsk_sl_preprocessor_get (preproc); @@ -259,7 +270,8 @@ gsk_sl_declaration_parse_variable (GskSlScope *scope, } variable = gsk_sl_declaration_new (&GSK_SL_DECLARATION_VARIABLE); - variable->variable = gsk_sl_variable_new (name, type, qualifier, NULL); + variable->variable = gsk_sl_variable_new (name, type, qualifier, initial_value); + variable->initial = initial; gsk_sl_scope_add_variable (scope, variable->variable); return &variable->parent; diff --git a/testsuite/gsksl/errors/initialize-global-const.frag b/testsuite/gsksl/errors/initialize-global-const.frag new file mode 100644 index 0000000000..8a4974759b --- /dev/null +++ b/testsuite/gsksl/errors/initialize-global-const.frag @@ -0,0 +1,6 @@ +const int x; + +void +main () +{ +} diff --git a/testsuite/gsksl/errors/initialize-local-const.frag b/testsuite/gsksl/errors/initialize-local-const.frag new file mode 100644 index 0000000000..d541795b65 --- /dev/null +++ b/testsuite/gsksl/errors/initialize-local-const.frag @@ -0,0 +1,5 @@ +void +main () +{ + const int x; +} |