1// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -std=c++11 %s 2>&1 | FileCheck %s 2 3template<typename T, typename U> 4struct pair {}; 5 6template<typename T, typename U> 7struct map { 8 typedef pair<T,U> *iterator; 9 iterator begin(); 10 iterator end(); 11}; 12 13template<typename T, typename U> 14pair<T,U> &tie(T &, U &); 15 16int 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 32namespace PR19176 { 33struct 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 44void 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