1 | // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -std=c++11 %s 2>&1 | FileCheck %s |
2 | |
3 | template<typename T, typename U> |
4 | struct pair {}; |
5 | |
6 | template<typename T, typename U> |
7 | struct map { |
8 | typedef pair<T,U> *iterator; |
9 | iterator begin(); |
10 | iterator end(); |
11 | }; |
12 | |
13 | template<typename T, typename U> |
14 | pair<T,U> &tie(T &, U &); |
15 | |
16 | int foo(map<char*,int> &m) { |
17 | char *p; |
18 | int n; |
19 | |
20 | for (pair<char*,int> x : m) { |
21 | (void)x; |
22 | } |
23 | |
24 | for (tie(p, n) : m) { // expected-error {{for range declaration must declare a variable}} |
25 | (void)p; |
26 | (void)n; |
27 | } |
28 | |
29 | return n; |
30 | } |
31 | |
32 | namespace PR19176 { |
33 | struct Vector { |
34 | struct iterator { |
35 | int &operator*(); |
36 | iterator &operator++(); |
37 | iterator &operator++(int); |
38 | bool operator==(const iterator &) const; |
39 | }; |
40 | iterator begin(); |
41 | iterator end(); |
42 | }; |
43 | |
44 | void f() { |
45 | Vector v; |
46 | int a[] = {1, 2, 3, 4}; |
47 | for (auto foo = a) // expected-error {{range-based 'for' statement uses ':', not '='}} |
48 | // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:19-[[@LINE-1]]:20}:":" |
49 | (void)foo; |
50 | for (auto i |
51 | = |
52 | v) // expected-error@-1 {{range-based 'for' statement uses ':', not '='}} |
53 | // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:8}:":" |
54 | (void)i; |
55 | #define FORRANGE(v, a) for (DECLVARWITHINIT(v) a) // expected-note {{expanded from macro}} |
56 | #define DECLAUTOVAR(v) auto v |
57 | #define DECLVARWITHINIT(v) DECLAUTOVAR(v) = // expected-note {{expanded from macro}} |
58 | FORRANGE(i, a) { // expected-error {{range-based 'for' statement uses ':', not '='}} |
59 | |
60 | } |
61 | } |
62 | } |
63 | |