18ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s 2de99a45c1295ec8e2eea20d35906178ff10722b5Eli Friedman 3de99a45c1295ec8e2eea20d35906178ff10722b5Eli Friedmantemplate <class A> int x(A x) { return x++; } 4de99a45c1295ec8e2eea20d35906178ff10722b5Eli Friedmanint y() { return x<int>(1); } 58ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 68ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregornamespace PR5880 { 78ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor template<typename T> 88ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor struct A { 92fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu static const int a = __builtin_offsetof(T, a.array[5].m); // expected-error{{no member named 'a' in 'HasM'}} 108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor struct HasM { 128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor float m; 138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor struct ArrayOfHasM { 168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor HasM array[10]; 178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor struct B { ArrayOfHasM a; }; 208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor A<B> x; 218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor A<HasM> x2; // expected-note{{in instantiation of}} 2229d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor 2329d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor template<typename T> 2429d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor struct AnonymousUnion { 2529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor union { 2629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor int i; 2729d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor float f; 2829d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor }; 2929d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor }; 3029d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor 3129d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor template<typename T> 3229d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor void test_anon_union() { 3329d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor int array1[__builtin_offsetof(AnonymousUnion<T>, f) == 0? 1 : -1]; 3429d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor int array2[__builtin_offsetof(AnonymousUnion<int>, f) == 0? 1 : -1]; 3529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor } 3629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor 3729d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor template void test_anon_union<int>(); 388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 3982b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith 4082b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smithnamespace AddrOfClassMember { 4182b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith template <typename T> struct S { 4282b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith int n; 4382b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith static void f() { 4482b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith +T::n; // expected-error {{invalid use of member}} 4582b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith } 4682b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith }; 4782b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith void g() { S<S<int> >::f(); } // expected-note {{in instantiation of}} 4882b0001f79568199c7e5aa564f7ca9d43cc89d86Richard Smith} 49