Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

チェンジ! ボラタイル!

タグ: Objective-C C++ gcc

以下のObjective-C++コードをgcc 4.2.1でコンパイルすると、foo2の初期化呼び出しでコンパイルエラーが発生する。

@interface Foo : NSObject
- (id)initWithReference:(int&)n;
@end

void bar(int&);

void baz()
{
    int n = 1;

    // 問題なし
    Foo* foo1 = [[Foo alloc] initWithReference:n];
    // 問題なし
    bar(n);
    
    @synchronized(foo1) {}
    
    // error: invalid initialization of reference of type 'int&' from expression of type 'volatile int'
    Foo* foo2 = [[Foo alloc] initWithReference:n];
    // 問題なし
    bar(n);
}

GCCのBugzillaには、これに似た次のようなバグが上げられている。

Bug 35967 - Local variables interpreted as volatile following a @try block - GCC Bugzilla

「ローカル変数の型修飾がブロック途中で変わる」とは……考えになかった。
しかし、setjmp/longjmpを使う@try/@catch/@finallyはともかく、@synchronizedではローカル変数をvolatile修飾する必要などないのでは。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/189-9553cd4b
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。