187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify
287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith// This is a test for an egregious hack in Clang that works around
4a80d1b4c5ecf1a93bcf3b1438e0e03cf2ff34b39Richard Smith// an issue with libstdc++-4.2's <tr1/hashtable> implementation.
5a80d1b4c5ecf1a93bcf3b1438e0e03cf2ff34b39Richard Smith// The code in question returns 'false' from a function with a pointer
6a80d1b4c5ecf1a93bcf3b1438e0e03cf2ff34b39Richard Smith// return type, which is ill-formed in C++11.
787c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
887c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#ifdef BE_THE_HEADER
987c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
1087c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#pragma GCC system_header
1187c29321c4b819d8a10f362f42fb7f7226820041Richard Smithnamespace std {
1287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith  namespace tr1 {
1387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith    template<typename T> struct hashnode;
1487c29321c4b819d8a10f362f42fb7f7226820041Richard Smith    template<typename T> struct hashtable {
1587c29321c4b819d8a10f362f42fb7f7226820041Richard Smith      typedef hashnode<T> node;
1687c29321c4b819d8a10f362f42fb7f7226820041Richard Smith      node *find_node() {
1787c29321c4b819d8a10f362f42fb7f7226820041Richard Smith        // This is ill-formed in C++11, per core issue 903, but we accept
1887c29321c4b819d8a10f362f42fb7f7226820041Richard Smith        // it anyway in a system header.
1987c29321c4b819d8a10f362f42fb7f7226820041Richard Smith        return false;
2087c29321c4b819d8a10f362f42fb7f7226820041Richard Smith      }
2187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith    };
2287c29321c4b819d8a10f362f42fb7f7226820041Richard Smith  }
2387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith}
2487c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
2587c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#else
2687c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
2787c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#define BE_THE_HEADER
2887c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#include "libstdcxx_pointer_return_false_hack.cpp"
2987c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
3087c29321c4b819d8a10f362f42fb7f7226820041Richard Smithauto *test1 = std::tr1::hashtable<int>().find_node();
3187c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
3287c29321c4b819d8a10f362f42fb7f7226820041Richard Smithvoid *test2() { return false; } // expected-error {{cannot initialize}}
3387c29321c4b819d8a10f362f42fb7f7226820041Richard Smith
3487c29321c4b819d8a10f362f42fb7f7226820041Richard Smith#endif
35