次のサンプルコードがあります。
@interface S1 : NSObject
{
void(*fn_)();
}
@end
@implementation S1
- (void) set:(BOOL)f
{
if (f)
{
struct A { static void f() { std::cout << "1" << std::endl; } };
fn_ = A::f;
}
else
{
struct A { static void f() { std::cout << "2" << std::endl; } };
fn_ = A::f;
}
}
- (void) test { fn_(); }
@end
struct S2
{
void set(BOOL f)
{
if (f)
{
struct A { static void f() { std::cout << "1" << std::endl; } };
fn_ = A::f;
}
else
{
struct A { static void f() { std::cout << "2" << std::endl; } };
fn_ = A::f;
}
}
void test() { fn_(); }
void(*fn_)();
};
int main(int argc, const char * argv[])
{
auto s1 = [[S1 alloc] init];
[s1 set:TRUE];
[s1 test];
[s1 set:FALSE];
[s1 test];
S2 s2;
s2.set(TRUE);
s2.test();
s2.set(FALSE);
s2.test();
return 0;
}
印刷します
1
1
1
2
しかし、私は期待しています
1
2
1
2
2番目の構造体の名前を別の名前(「B」など)に変更すると、常に期待どおりに機能します。
警告は表示されないため、プログラムが正しく機能しない理由を見つけるのは困難です。
それは私の無知ですか、それともllvmのバグですか?