// 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}} }