about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2010-12-22 18:02:16 -0800
committerPatrick Walton <pcwalton@mimiga.net>2010-12-22 18:02:48 -0800
commitdaac7a8b130f8f2dfbdeaf38ff39541adfd74736 (patch)
tree5551ed6d7444478c5ddc5e4dba85848ba4ab6e89 /src
parent3f3a121043f72a1662f0b0ad24ca2fd09f4b4f27 (diff)
rustc: Add a type_has_dynamic_size predicate
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/ty.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs
index bfcfcb672d7..4dbd236f0b6 100644
--- a/src/comp/middle/ty.rs
+++ b/src/comp/middle/ty.rs
@@ -379,6 +379,27 @@ fn type_is_scalar(@t ty) -> bool {
     fail;
 }
 
+fn type_has_dynamic_size(@t ty) -> bool {
+    alt (ty.struct) {
+        case (ty_tup(?ts)) {
+            auto i = 0u;
+            while (i < _vec.len[@t](ts)) {
+                if (type_has_dynamic_size(ts.(i))) { ret true; }
+                i += 1u;
+            }
+        }
+        case (ty_rec(?fields)) {
+            auto i = 0u;
+            while (i < _vec.len[field](fields)) {
+                if (type_has_dynamic_size(fields.(i).ty)) { ret true; }
+                i += 1u;
+            }
+        }
+        case (ty_param(_)) { ret true; }
+        case (_) { /* fall through */ }
+    }
+    ret false;
+}
 
 fn type_is_integral(@t ty) -> bool {
     alt (ty.struct) {