>>756
その仮説で正しそうだが念のため確認してみた

まず>>741の通りだとdrop()を呼び出さずに当然コンパイルが通るので
何でもいいから関数呼び出し(演算含む)するものを間に挟んでみた
 let foo = Foo::new("Hello, World!");
 println!("test"); // ←ここに挿入
 foo.finalize()?;
するとこの形はdrop()を呼び出ように変化するようでリンクエラーとなる
この関数呼び出しはfooの参照を使うか否かに関係なく同じ結果

ところがfoo生成前に置くとコンパイルが通る
 println!("test");
 let foo = Foo::new("Hello, World!");
 foo.finalize()?;

さらにfoo消滅後に置いてもコンパイルが通る
 let foo = Foo::new("Hello, World!");
 foo.finalize()?;
 println!("test");

したがってfooが有効な期間に何か関数呼び出しがそこで起きる時のみ
drop()が呼ばれるコードが用意されてリンクエラーとなっている
これはRustがpanic時もメモリ解放をきちんと扱う話とも合致する
つまりpanic時の巻き戻し時のfoo解放をコンパイラが用意している仮説で正しいようだ