diff options
Diffstat (limited to 'clang/test/CXX/temp/temp.res/temp.local')
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p1.cpp | 32 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p3.cpp | 32 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p7.cpp | 10 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p8.cpp | 53 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p9.cpp | 15 | 
5 files changed, 142 insertions, 0 deletions
| diff --git a/clang/test/CXX/temp/temp.res/temp.local/p1.cpp b/clang/test/CXX/temp/temp.res/temp.local/p1.cpp new file mode 100644 index 0000000..1ad4464 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p1.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// C++0x [temp.local]p1: +//   Like normal (non-template) classes, class templates have an +//   injected-class-name (Clause 9). The injected-class-name can be used with +//   or without a template-argument-list. When it is used without +//   a template-argument-list, it is equivalent to the injected-class-name +//   followed by the template-parameters of the class template enclosed in <>. + +template <typename T> struct X0 { +  X0(); +  ~X0(); +  X0 f(const X0&); +}; + +// Test non-type template parameters. +template <int N1, const int& N2, const int* N3> struct X1 { +  X1(); +  ~X1(); +  X1 f(const X1& x1a) { X1 x1b(x1a); return x1b; } +}; + +//   When it is used with a template-argument-list, it refers to the specified +//   class template specialization, which could be the current specialization +//   or another specialization. +// FIXME: Test this clause. + +int i = 42; +void test() { +  X0<int> x0; (void)x0; +  X1<42, i, &i> x1; (void)x1; +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p3.cpp b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp new file mode 100644 index 0000000..54da885 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -verify %s + +template <class T> struct Base { // expected-note 4 {{member found by ambiguous name lookup}} +  static void f(); +};  + +struct X0 { }; + +template <class T> struct Derived: Base<int>, Base<char> { +  typename Derived::Base b;	// expected-error{{member 'Base' found in multiple base classes of different types}} +  typename Derived::Base<double> d;	// OK + +  void g(X0 *t) { +    t->Derived::Base<T>::f(); +    t->Base<T>::f(); +    t->Base::f(); // expected-error{{member 'Base' found in multiple base classes of different types}} \ +    // expected-error{{no member named 'f' in 'X0'}} \ +    // expected-error{{expected a class or namespace}} +  } +}; + +namespace PR6717 { +  template <typename T> +  class WebVector { +  } // expected-error {{expected ';' after class}} + +    WebVector(const WebVector<T>& other) { } // expected-error{{undeclared identifier 'T'}} \ +                                                expected-error{{requires a type specifier}} + +  template <typename C> +  WebVector<T>& operator=(const C& other) { } // expected-error{{undeclared identifier 'T'}} +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p7.cpp b/clang/test/CXX/temp/temp.res/temp.local/p7.cpp new file mode 100644 index 0000000..bd05e75 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p7.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +template<class T> struct A {  +  int B; +  int f(); +};  + +template<class B> int A<B>::f() { +  return B; +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p8.cpp b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp new file mode 100644 index 0000000..5d9d509 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace N {  +  enum { C }; +  template<class T> class B { +    void f(T); +  };  +} + +template<class C> void N::B<C>::f(C) { +  C b; +} + +namespace N { +  enum { D }; +  namespace M { +    enum { C , D }; +    template<typename C> class X { +      template<typename U> void f(C, U); + +      template<typename D> void g(C, D) { +        C c; +        D d; +      } +    }; + +    struct Y { +      template<typename U> void f(U);       +    }; +  } + +  struct Y { +    template<typename D> void f(D); +  }; +} + +template<typename C>  +template<typename D> +void N::M::X<C>::f(C, D) { +  C c; +  D d; +} + +template<typename C> +void N::M::Y::f(C) { +  C c; +} + +template<typename D>  +void N::Y::f(D) { +  D d; +} + diff --git a/clang/test/CXX/temp/temp.res/temp.local/p9.cpp b/clang/test/CXX/temp/temp.res/temp.local/p9.cpp new file mode 100644 index 0000000..9ca8d88 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p9.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +struct A {  +  struct B { void f(); };  +  int a;  +  int Y; +}; + +template<class B, class a> struct X : A {  +  B b;  // A's B  +  a c;  // expected-error{{unknown type name 'a'}}  + +  void g() { +    b.g(); // expected-error{{no member named 'g' in 'A::B'}} +  } +}; | 
