blob: 996b1cf50ac8088f5338febb50b990ea1fbebc4d [file] [log] [blame]
Matt Beaumont-Gay09f34622011-02-25 19:09:01 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregor5149f372011-02-25 15:54:31 +00002
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
Douglas Gregorf3db29f2011-02-25 18:19:59 +000043
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}
Douglas Gregor00cf3cc2011-02-25 20:49:16 +000064
65template<typename T>
66struct DependentScopedDeclRefExpr {
67 void f() {
Douglas Gregor7c3179c2011-02-28 18:50:33 +000068 outer_alias::inner::X0<typename add_reference<T>::type
69 * // expected-error{{as a pointer to a reference of type}}
70 >::value = 17;
Douglas Gregor00cf3cc2011-02-25 20:49:16 +000071 }
72};
Douglas Gregor7c3179c2011-02-28 18:50:33 +000073
74void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {
75 t.f(); // expected-note{{in instantiation of member function}}
76}
Douglas Gregor2494dd02011-03-01 01:34:45 +000077
78
79template<typename T>
80struct TypenameTypeTester {
81 typedef typename outer::inner::X0<
82 typename add_reference<T>::type
83 * // expected-error{{declared as a pointer to a reference of type}}
84 >::type type;
85};
86
87TypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}}