// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core -analyzer-output=plist-multi-file -o %t.plist -verify -analyzer-config eagerly-assume=false %s
// RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/cxx-for-range.cpp.plist -

extern void work();

void testLoop() {
  int z[] = {1,2};
  for (int y : z) {
    work();
    work();
    if (y == 2)
      *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
    work();
    work();
    (void)y;
  }

  *(volatile int *)0 = 1; // no-warning
}

class MagicVector {
public:
  MagicVector();

  using iterator = int *;

  iterator begin() const;
  iterator end() const;
};

MagicVector get(bool fail = false) {
  if (fail)
    *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
  return MagicVector{};
}

void testLoopOpaqueCollection() {
  for (int y : get()) {
    work();
    work();
    if (y == 2)
      *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
    work();
    work();
    (void)y;
  }

  *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
}


class MagicVector2 {
public:
  MagicVector2();

  class iterator {
  public:
    int operator*() const;
    iterator &operator++();
    bool operator==(const iterator &);
    bool operator!=(const iterator &);
  };

  iterator begin() const;
  iterator end() const;
};

MagicVector2 get2() {
  return MagicVector2{};
}

void testLoopOpaqueIterator() {
  for (int y : get2()) {
    work();
    work();
    if (y == 2)
      *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
    work();
    work();
    (void)y;
  }

  *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
}


void testLoopErrorInRange() {
  for (int y : get(true)) { // error inside get()
    work();
    work();
    if (y == 2)
      *(volatile int *)0 = 1; // no-warning
    work();
    work();
    (void)y;
  }

  *(volatile int *)0 = 1; // no-warning
}

void testForRangeInit() {
  for (int *arr[3] = {nullptr, nullptr, nullptr}; int *p : arr) // expected-warning {{extension}}
    *p = 1; // expected-warning {{Dereference of null pointer}}
}
