CTFE時にネストした関数から外側の関数の引数が正しく使えない.


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2010/3/30 3:53
satoru_h  新米   投稿数: 9
ネストした関数をCTFEで実行する時に外側の関数の引数が.init(or null)となる問題が発生しました.

Linux/dmd 2.042です.
他の環境では確認していません.

auto f(string s)
{
  return
  {
    assert(s);
  };
}

関数fをCTFEで実行すると,fの引数に関係なくassertに失敗します.
通常の実行では問題ありません.

CTFE時にネストした関数内部では外側の関数の引数がすべて.init(or null)になってしまっているようです.

とりあえず以下の様にすれば回避できます.

auto f(string s_)
{
  auto s = s_;

  return
  {
    assert(s);
  };
}
投票数:94 平均点:7.23
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2010/3/30 6:23
SHOO 
投稿しました。

http://d.puremagic.com/issues/show_bug.cgi?id=4027

これでいいかな?


しかしあれですね、一度投稿してしまうと、バグ報告に躊躇いがなくなりますね。
投票数:62 平均点:4.84
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/3/30 10:27
satoru_h  新米   投稿数: 9
ありがとうございます.
投票数:53 平均点:4.15
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2010/4/2 2:40
tama  一人前   投稿数: 111
Donのreplyで「その回避策も駄目だよ」と書いてると思うんですが,例がそもそもコンパイルが通らないような…delegateの()による呼び出しがコンパイルタイムに呼べないことを言ってるのかな…?
どちらにせよ,バグじゃなくて現状サポートされてないようでorz
投票数:72 平均点:5.28
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/4/2 3:31
satoru_h  新米   投稿数: 9
失礼しました.
コードが不完全でした.

#code(d){{{
auto f(string s)
{
return { return s; };
}

auto run(string delegate() f)
{
return f();
}

unittest
{
static assert(run(f("aaa")) == "aaa");
}}}

このコードの様にdelegateの呼び出しができない問題は回避していました.

また,http://dusers.dip.jp/modules/forum/index.php?topic_id=61 の問題はこの回避策が引き起こしているようで,それはそれでダメなのでした.
投票数:69 平均点:3.19
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/4/4 10:11
SHOO  管理人   投稿数: 658
どうやらWalter氏が頑張ってくれたようですね。 ネット環境が無いのでDL試せていませんが、エラーメッセージを表示する方向で話がついたのでしょうか?
投票数:36 平均点:4.17
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/4/11 0:49
SHOO  管理人   投稿数: 658
http://dusers.dip.jp/modules/forum/index.php?topic_id=63
http://www.digitalmars.com/d/2.0/changelog.html#new2_043
解決しました。どうやら仕様外のため、コンパイルエラーを吐くようにしたみたいですね。
投票数:32 平均点:5.31
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu