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