1 // RUN: not %clang -fsyntax-only -std=c++11 -ferror-limit=1 %s 2>&1 | FileCheck %s
2 
3 // Test case for PR35682.
4 // The issue be caused by the typo correction that changes String to the
5 // incomplete type string. The example is based on the std::pair code and
6 // reduced to a minimal test case. When using std::pair the issue can only be
7 // reproduced when using the -stdlib=libc++ compiler option.
8 
9 template <class T> class allocator;
10 
11 template <class charT> struct char_traits;
12 
13 template <class CharT, class Traits = char_traits<CharT>,
14           class Allocator = allocator<CharT>>
15 class basic_string;
16 typedef basic_string<char, char_traits<char>, allocator<char>> string;
17 
18 template <bool, class Tp = void> struct enable_if {};
19 template <class Tp> struct enable_if<true, Tp> { typedef Tp type; };
20 
21 template <class Tp, Tp v> struct integral_constant {
22   static constexpr const Tp value = v;
23   typedef Tp value_type;
24   typedef integral_constant type;
25 
operator value_typeintegral_constant26   constexpr operator value_type() const noexcept { return value; }
operator ()integral_constant27   constexpr value_type operator()() const noexcept { return value; }
28 };
29 
30 template <class Tp, Tp v> constexpr const Tp integral_constant<Tp, v>::value;
31 
32 using true_type = integral_constant<bool, true>;
33 using false_type = integral_constant<bool, false>;
34 
35 template <class Tp, class Up> struct is_same : public false_type {};
36 template <class Tp> struct is_same<Tp, Tp> : public true_type {};
37 
38 template <class T> struct single {
39   typedef T first_type;
40 
41   T first;
42 
43   struct CheckArgs {
enable_implicitsingle::CheckArgs44     template <class U1> static constexpr bool enable_implicit() {
45       return is_same<first_type, U1>::value;
46     }
47   };
48 
49   template <class U1,
50             typename enable_if<CheckArgs::template enable_implicit<U1>(),
51                                bool>::type = false>
52   single(U1 &&u1);
53 };
54 
55 using SetKeyType = String;
56 single<SetKeyType> v;
57 
58 // CHECK: error: unknown type name 'String'; did you mean 'string'?
59 // CHECK: fatal error: too many errors emitted, stopping now [-ferror-limit=]
60 // CHECK-NOT: Assertion{{.*}}failed
61