[vala] codegen: Don't convert GValue/GVariant on non-null cast



commit eeee60a8bb762206fe00c630b7669b38321cee35
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Jun 22 09:17:46 2013 +0200

    codegen: Don't convert GValue/GVariant on non-null cast
    
    Fixes bug 702846

 codegen/valaccodebasemodule.vala |   24 +++++++++++++-----------
 tests/Makefile.am                |    1 +
 tests/objects/bug702846.vala     |    6 ++++++
 3 files changed, 20 insertions(+), 11 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index ec477cc..1a90ec0 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5010,19 +5010,21 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public override void visit_cast_expression (CastExpression expr) {
-               var valuecast = try_cast_value_to_type (get_cvalue (expr.inner), expr.inner.value_type, 
expr.type_reference, expr);
-               if (valuecast != null) {
-                       set_cvalue (expr, valuecast);
-                       return;
-               }
+               generate_type_declaration (expr.type_reference, cfile);
 
-               var variantcast = try_cast_variant_to_type (expr.inner.target_value, expr.type_reference, 
expr);
-               if (variantcast != null) {
-                       expr.target_value = variantcast;
-                       return;
-               }
+               if (!expr.is_non_null_cast) {
+                       var valuecast = try_cast_value_to_type (get_cvalue (expr.inner), 
expr.inner.value_type, expr.type_reference, expr);
+                       if (valuecast != null) {
+                               set_cvalue (expr, valuecast);
+                               return;
+                       }
 
-               generate_type_declaration (expr.type_reference, cfile);
+                       var variantcast = try_cast_variant_to_type (expr.inner.target_value, 
expr.type_reference, expr);
+                       if (variantcast != null) {
+                               expr.target_value = variantcast;
+                               return;
+                       }
+               }
 
                var cl = expr.type_reference.data_type as Class;
                var iface = expr.type_reference.data_type as Interface;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5b16544..07c505e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -137,6 +137,7 @@ TESTS = \
        objects/bug695671.vala \
        objects/bug701978.vala \
        objects/bug702736.vala \
+       objects/bug702846.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug702846.vala b/tests/objects/bug702846.vala
new file mode 100644
index 0000000..e160ceb
--- /dev/null
+++ b/tests/objects/bug702846.vala
@@ -0,0 +1,6 @@
+void main () {
+       Variant? foo = "baz";
+       Variant bar = (!) foo;
+       string baz = (string) bar;
+       assert (baz == "baz");
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]