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