1b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify 2b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 3b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith// This is a test for an egregious hack in Clang that works around 4b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith// an issue with GCC's <type_traits> implementation. std::common_type 5b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith// relies on pre-standard rules for decltype(), in which it doesn't 6b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith// produce reference types so frequently. 7b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 8b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#ifdef BE_THE_HEADER 9b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 10b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#pragma GCC system_header 11b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smithnamespace std { 12b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith template<typename T> T &&declval(); 13b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 14b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith template<typename...Ts> struct common_type {}; 15b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith template<typename A, typename B> struct common_type<A, B> { 16b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith // Under the rules in the standard, this always produces a 17b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith // reference type. 18b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith typedef decltype(true ? declval<A>() : declval<B>()) type; 19b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith }; 20b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith} 21b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 22b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#else 23b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 24b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#define BE_THE_HEADER 25b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#include "libstdcxx_common_type_hack.cpp" 26b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 27b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smithusing T = int; 28b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smithusing T = std::common_type<int, int>::type; 29b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 30b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smithusing U = int; // expected-note {{here}} 31b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smithusing U = decltype(true ? std::declval<int>() : std::declval<int>()); // expected-error {{different types}} 32b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith 33b5b37d194dddb960f43f763b3f9c3e17e7be3c2dRichard Smith#endif 34