reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
// RUN: %clang_cc1 -std=c++11 %s -emit-pch -o %t.pch
// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -include-pch %t.pch -verify
// expected-no-diagnostics

// rdar://12631281
// This reduced test case exposed a use-after-free memory bug, which was reliable
// reproduced only on guarded malloc (and probably valgrind).

#ifndef HEADER
#define HEADER

template < class _T2> struct  is_convertible;
template <> struct is_convertible<int> { typedef int type; };

template <class _T1, class _T2> struct  pair {
  typedef _T1 first_type;
  typedef _T2 second_type;
  template <class _U1, class _U2, class = typename is_convertible< first_type>::type>
    pair(_U1&& , _U2&& ); // expected-note {{candidate}}
};

template <class _ForwardIterator>
pair<_ForwardIterator, _ForwardIterator> __equal_range(_ForwardIterator) {
  return pair<_ForwardIterator, _ForwardIterator>(0, 0); // expected-error {{no matching constructor}}
}

template <class _ForwardIterator>
pair<_ForwardIterator, _ForwardIterator> equal_range( _ForwardIterator a) {
  return __equal_range(a); // expected-note {{instantiation}}
}

class A {
  pair<int, int> range() {
    return equal_range(0); // expected-note {{instantiation}}
  }
};

#else

#endif