nested-name-spec-locations.cpp revision 7c3179cf463c3b3b8c21dbb955f933ba50b74f28
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// Note: the formatting in this test case is intentionally funny, with
4// nested-name-specifiers stretched out vertically so that we can
5// match up diagnostics per-line and still verify that we're getting
6// good source-location information.
7
8namespace outer {
9  namespace inner {
10    template<typename T>
11    struct X0 {
12    };
13  }
14}
15
16template<typename T>
17struct add_reference {
18  typedef T& type;
19};
20
21namespace outer_alias = outer;
22
23template<typename T>
24struct UnresolvedUsingValueDeclTester {
25  using outer::inner::X0<
26          typename add_reference<T>::type
27    * // expected-error{{declared as a pointer to a reference of type}}
28        >::value;
29};
30
31UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}}
32
33template<typename T>
34struct UnresolvedUsingTypenameDeclTester {
35  using outer::inner::X0<
36          typename add_reference<T>::type
37    * // expected-error{{declared as a pointer to a reference of type}}
38        >::value;
39};
40
41UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}}
42
43
44template<typename T, typename U>
45struct PseudoDestructorExprTester {
46  void f(T *t) {
47    t->T::template Inner<typename add_reference<U>::type
48      * // expected-error{{as a pointer to a reference of type}}
49      >::Blarg::~Blarg();
50  }
51};
52
53struct HasInnerTemplate {
54  template<typename T>
55  struct Inner;
56
57  typedef HasInnerTemplate T;
58};
59
60void PseudoDestructorExprCheck(
61                    PseudoDestructorExprTester<HasInnerTemplate, float> tester) {
62  tester.f(0); // expected-note{{in instantiation of member function}}
63}
64
65template<typename T>
66struct DependentScopedDeclRefExpr {
67  void f() {
68    outer_alias::inner::X0<typename add_reference<T>::type
69      * // expected-error{{as a pointer to a reference of type}}
70      >::value = 17;
71  }
72};
73
74void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {
75  t.f(); // expected-note{{in instantiation of member function}}
76}
77