#include <iostream>
struct TestStructure;
void TestFunction(TestStructure*); // forward declaration
struct TestStructure {
int i;
void TestFunction(TestStructure* /*unused*/) {
std::cout << "TestStructure TestFunction\n";
}
void foo() {
std::cout << "From foo:\n";
TestFunction(this);
std::cout << "::TestFunction:\n";
::TestFunction(this);
}
};
void TestFunction(TestStructure* /*unused*/) {
std::cout << "Free TestFunction\n";
}
int main() {
std::cout << "From main:\n";
TestFunction(nullptr);
TestStructure t;
t.foo();
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICBzdHJ1Y3QgVGVzdFN0cnVjdHVyZTsKCiAgICB2b2lkIFRlc3RGdW5jdGlvbihUZXN0U3RydWN0dXJlKik7ICAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCgogICAgc3RydWN0IFRlc3RTdHJ1Y3R1cmUgewogICAgICAgIGludCBpOwogICAgICAgIHZvaWQgVGVzdEZ1bmN0aW9uKFRlc3RTdHJ1Y3R1cmUqIC8qdW51c2VkKi8pIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJUZXN0U3RydWN0dXJlIFRlc3RGdW5jdGlvblxuIjsKICAgICAgICB9CiAgICAgICAgdm9pZCBmb28oKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRnJvbSBmb286XG4iOwogICAgICAgICAgICBUZXN0RnVuY3Rpb24odGhpcyk7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiOjpUZXN0RnVuY3Rpb246XG4iOwogICAgICAgICAgICA6OlRlc3RGdW5jdGlvbih0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIHZvaWQgVGVzdEZ1bmN0aW9uKFRlc3RTdHJ1Y3R1cmUqIC8qdW51c2VkKi8pIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkZyZWUgVGVzdEZ1bmN0aW9uXG4iOwogICAgfQoKICAgIGludCBtYWluKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRnJvbSBtYWluOlxuIjsKICAgICAgICBUZXN0RnVuY3Rpb24obnVsbHB0cik7CgogICAgICAgIFRlc3RTdHJ1Y3R1cmUgdDsKICAgICAgICB0LmZvbygpOwogICAgfQo=