Special-case the forward declaration of STL types for libc++.
authorRaphael Kubo da Costa <rakuco@FreeBSD.org>
Fri, 10 May 2013 01:08:38 +0000 (04:08 +0300)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sat, 11 May 2013 19:45:30 +0000 (21:45 +0200)
commit8d33f673d3aaa7107c8e86d6591bd3f077f0313d
treeb41c197d9d489549e6ad5fb3bd34372a7b83bea1
parent10e5e4b1044ed9f448a61630877c8528de2c0835
Special-case the forward declaration of STL types for libc++.

This is somewhat of a follow-up to 5210d47aa66214e3cb16f394d0510a91f770c1b1.
libc++ declares the STL types in an inline namespace within the "std" one if
clang is used.

If one includes a header such as <iterator> before a Qt one and builds with
QT_NO_STL, the following ends up happening:

  // <iterator>
  namespace std {
      inline namespace __1 {
          struct random_access_iterator ... ;
      }
  }

  // qiterator.h
  #ifdef QT_NO_STL
  namespace std {
     struct random_access_iterator;
  }
  #endif

qiterator.h's declaration shadows the original one, and the compiler
complains random_access_iterator lacks an actual declaration.

Solve this by checking for libc++ and forward-declaring the iterator types
we need within the same inline namespace.

Not backported from qtbase because QT_NO_STL does not exist in Qt 5.

Change-Id: I6742d540f6538a30aa060a4447c288cfb9cd781d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/tools/qiterator.h