#include <iostream>
struct widget
{
struct baz { explicit baz() { std::cout << "constructor\n"; } };
static void baz() { std::cout << "function\n"; }
};
int main()
{
typename widget::baz(); // g++ bugs
widget::baz();
return 0;
}
// whereas clang gives:
// clang++ -std=c++11 -O0 -Wall -Wextra -pedantic -pthread main.cpp && ./a.out
// main.cpp:11:22: error: typename specifier refers to non-type member 'baz' in 'widget'
// typename widget::baz();
// ~~~~~~~~~~~~~~~~~^~~
//
// main.cpp:6:17: note: referenced member 'baz' is declared here
// static void baz() { std::cout << "function\n"; }
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IHdpZGdldAp7CglzdHJ1Y3QgYmF6IHsgZXhwbGljaXQgYmF6KCkgeyBzdGQ6OmNvdXQgPDwgImNvbnN0cnVjdG9yXG4iOyB9IH07CglzdGF0aWMgdm9pZCBiYXooKSB7IHN0ZDo6Y291dCA8PCAiZnVuY3Rpb25cbiI7IH0KfTsKCmludCBtYWluKCkKewoJdHlwZW5hbWUgd2lkZ2V0OjpiYXooKTsgLy8gZysrIGJ1Z3MKCXdpZGdldDo6YmF6KCk7CglyZXR1cm4gMDsKfQovLyB3aGVyZWFzIGNsYW5nIGdpdmVzOgovLyBjbGFuZysrIC1zdGQ9YysrMTEgLU8wIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1wdGhyZWFkIG1haW4uY3BwICYmIC4vYS5vdXQKLy8gbWFpbi5jcHA6MTE6MjI6IGVycm9yOiB0eXBlbmFtZSBzcGVjaWZpZXIgcmVmZXJzIHRvIG5vbi10eXBlIG1lbWJlciAnYmF6JyBpbiAnd2lkZ2V0JwovLyAgICAgdHlwZW5hbWUgd2lkZ2V0OjpiYXooKTsKLy8gICAgIH5+fn5+fn5+fn5+fn5+fn5+Xn5+Ci8vCi8vIG1haW4uY3BwOjY6MTc6IG5vdGU6IHJlZmVyZW5jZWQgbWVtYmVyICdiYXonIGlzIGRlY2xhcmVkIGhlcmUKLy8gc3RhdGljIHZvaWQgYmF6KCkgeyBzdGQ6OmNvdXQgPDwgImZ1bmN0aW9uXG4iOyB9