FuelLabs / sway

🌴 Empowering everyone to build reliable and efficient smart contracts.
https://docs.fuel.network/docs/sway/
Apache License 2.0
62.79k stars 5.36k forks source link

Infinite recursion on type propagation #6442

Open tritao opened 3 weeks ago

tritao commented 3 weeks ago
library;

struct Vec<T> {
}

impl<T> Vec<T> {
  fn new() -> Self { return Self {} }
  fn push(elem: T) {}
}

trait Wrap {
 fn wrap(self) -> Vec<Self>;
}

impl<T> Wrap for Vec<T> {
 fn wrap(self) -> Vec<Self> {
 let mut v = Vec::new();
 v.push(self);
 v
 }
}

fn main() {}

This is related to v.push(self); line.

thread 'main' panicked at sway-core/src/type_system/id.rs:195:13:
Possible infinite recursion at extract_any
stack backtrace:
   0: rust_begin_unwind
             at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:652:5
   1: core::panicking::panic_fmt
             at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panicking.rs:72:14
   2: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:195:13
   3: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
   4: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
   5: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
   6: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
   7: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
   8: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
   9: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  10: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  11: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  12: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  13: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  14: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  15: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  16: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  17: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  18: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  19: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  20: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  21: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  22: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  23: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  24: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  25: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  26: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  27: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  28: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  29: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  30: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  31: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  32: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  33: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  34: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  35: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  36: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  37: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  38: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  39: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  40: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  41: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  42: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  43: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  44: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  45: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  46: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  47: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  48: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  49: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  50: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  51: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  52: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  53: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  54: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  55: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  56: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  57: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  58: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  59: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  60: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  61: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  62: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  63: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  64: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  65: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  66: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  67: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  68: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  69: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  70: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  71: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  72: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  73: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  74: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  75: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  76: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  77: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  78: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  79: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  80: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  81: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  82: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  83: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  84: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  85: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  86: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  87: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  88: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  89: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
  90: sway_core::type_system::id::TypeId::extract_any
             at ./sway-core/src/type_system/id.rs:259:25
  91: sway_core::type_system::id::TypeId::extract_any_including_self
             at ./sway-core/src/type_system/id.rs:178:25
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
tritao commented 3 weeks ago

Alternative repro:

library;

struct Vec<T> {
}

impl<T> Vec<T> {
  fn new() -> Self { return Self {}}
  fn push(elem: T) {}
  fn wrap(self) -> Vec<Self> {
   let mut v = Vec::new();
   v.push(self);
   v
  }
}

fn main() {
 let mut a: Vec<_> = Vec::new();
 a.push("str");
}