brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · a5cbcfc Raw
90 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2struct A0 {3  struct K { };4};5 6template <typename T> struct B0: A0 {7  static void f() {8    K k;9  }10};11 12namespace E1 {13  typedef double A;14 15  template<class T> class B {16    typedef int A;17  };18 19  template<class T>20  struct X : B<T> {21    A* blarg(double *dp) {22      return dp;23    }24  };25}26 27namespace E2 {28  struct A {29    struct B;30    int *a;31    int Y;32  };33 34  int a;35  template<class T> struct Y : T {36    struct B { /* ... */ };37    B b;38    void f(int i) { a = i; }39    Y* p;40  };41 42  Y<A> ya;43}44 45namespace PR14402 {46  template<typename T>47  struct A {48    typedef int n;49    int f();50 51    struct B {};52    struct C : B {53      // OK, can't be sure whether we derive from A yet.54      using A::n;55      int g() { return f(); }56    };57 58    struct D {59      using A::n; // expected-error {{using declaration refers into 'A<T>', which is not a base class of 'D'}}60      int g() { return f(); } // expected-error {{call to non-static member function 'f' of 'A' from nested type 'D'}}61    };62 63    struct E { char &f(); };64    struct F : E {65      // FIXME: Reject this prior to instantiation; f() is known to return int.66      char &g() { return f(); }67      // expected-error@-1 {{'PR14402::A<int>::f' is not a member of class 'PR14402::A<int>::F'}}68      // expected-error@-2 {{non-const lvalue reference to type 'char' cannot bind to a temporary of type 'int'}}69    };70  };71 72  template<> struct A<int>::B : A<int> {};73  A<int>::C::n n = A<int>::C().g();74 75  // 'not a member'76  char &r = A<int>::F().g(); // expected-note {{in instantiation of}}77  template<> struct A<char>::E : A<char> {};78  // 'cannot bind to a temporary'79  char &s = A<char>::F().g(); // expected-note {{in instantiation of}}80 81  struct X;82  struct X { void f(); };83  struct X;84  template<typename T> struct Y : X {85    void g() {86      X::f();87    }88  };89}90