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