support addressof expressions for reference types, fixes bug 514495
authorJuerg Billeter <j@bitron.ch>
Tue, 5 Feb 2008 10:39:54 +0000 (10:39 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Tue, 5 Feb 2008 10:39:54 +0000 (10:39 +0000)
2008-02-05  Juerg Billeter  <j@bitron.ch>

* vala/valapointertype.vala, vala/valasemanticanalyzer.vala: support
  addressof expressions for reference types, fixes bug 514495

svn path=/trunk/; revision=971

ChangeLog
vala/valapointertype.vala
vala/valasemanticanalyzer.vala

index f481398..e917775 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2008-02-05  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valapointertype.vala, vala/valasemanticanalyzer.vala: support
+         addressof expressions for reference types, fixes bug 514495
+
+2008-02-05  Jürg Billeter  <j@bitron.ch>
+
        * vala/valasemanticanalyzer.vala: fix crash when casting an invalid
          expression, fixes bug 514331
 
index 9a9ede8..3ca05b9 100644 (file)
@@ -1,6 +1,6 @@
 /* valapointertype.vala
  *
- * Copyright (C) 2007  Jürg Billeter
+ * Copyright (C) 2007-2008  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -60,6 +60,11 @@ public class Vala.PointerType : DataType {
                        return true;
                }
 
+               if (base_type.is_reference_type_or_type_parameter ()) {
+                       // Object* is compatible with Object if Object is a reference type
+                       return base_type.compatible (target_type, enable_non_null);
+               }
+
                return false;
        }
 
index 2107f2c..fbb6f0f 100644 (file)
@@ -2323,7 +2323,11 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        return;
                }
 
-               expr.static_type = new PointerType (expr.inner.static_type);
+               if (expr.inner.static_type.is_reference_type_or_type_parameter ()) {
+                       expr.static_type = new PointerType (new PointerType (expr.inner.static_type));
+               } else {
+                       expr.static_type = new PointerType (expr.inner.static_type);
+               }
        }
 
        public override void visit_reference_transfer_expression (ReferenceTransferExpression! expr) {