xref: /aosp_15_r20/external/clang/test/SemaCXX/cxx11-crashes.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // rdar://12240916 stack overflow.
4*67e74705SXin Li namespace rdar12240916 {
5*67e74705SXin Li 
6*67e74705SXin Li struct S2 {
7*67e74705SXin Li   S2(const S2&);
8*67e74705SXin Li   S2();
9*67e74705SXin Li };
10*67e74705SXin Li 
11*67e74705SXin Li struct S { // expected-note {{not complete}}
12*67e74705SXin Li   S x; // expected-error {{incomplete type}}
13*67e74705SXin Li   S2 y;
14*67e74705SXin Li };
15*67e74705SXin Li 
foo()16*67e74705SXin Li S foo() {
17*67e74705SXin Li   S s;
18*67e74705SXin Li   return s;
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li struct S3; // expected-note {{forward declaration}}
22*67e74705SXin Li 
23*67e74705SXin Li struct S4 {
24*67e74705SXin Li   S3 x; // expected-error {{incomplete type}}
25*67e74705SXin Li   S2 y;
26*67e74705SXin Li };
27*67e74705SXin Li 
28*67e74705SXin Li struct S3 {
29*67e74705SXin Li   S4 x;
30*67e74705SXin Li   S2 y;
31*67e74705SXin Li };
32*67e74705SXin Li 
foo2()33*67e74705SXin Li S4 foo2() {
34*67e74705SXin Li   S4 s;
35*67e74705SXin Li   return s;
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li }
39*67e74705SXin Li 
40*67e74705SXin Li // rdar://12542261 stack overflow.
41*67e74705SXin Li namespace rdar12542261 {
42*67e74705SXin Li 
43*67e74705SXin Li template <class _Tp>
44*67e74705SXin Li struct check_complete
45*67e74705SXin Li {
46*67e74705SXin Li   static_assert(sizeof(_Tp) > 0, "Type must be complete.");
47*67e74705SXin Li };
48*67e74705SXin Li 
49*67e74705SXin Li 
50*67e74705SXin Li template<class _Rp>
51*67e74705SXin Li class function // expected-note 2 {{candidate}}
52*67e74705SXin Li {
53*67e74705SXin Li public:
54*67e74705SXin Li   template<class _Fp>
55*67e74705SXin Li   function(_Fp, typename check_complete<_Fp>::type* = 0);  // expected-note {{candidate}}
56*67e74705SXin Li };
57*67e74705SXin Li 
foobar()58*67e74705SXin Li void foobar()
59*67e74705SXin Li {
60*67e74705SXin Li   auto LeftCanvas = new Canvas(); // expected-error {{unknown type name}}
61*67e74705SXin Li   function<void()> m_OnChange = [&, LeftCanvas]() { }; // expected-error {{no viable conversion}}
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace b6981007 {
67*67e74705SXin Li   struct S {}; // expected-note 3{{candidate}}
f()68*67e74705SXin Li   void f() {
69*67e74705SXin Li     S s(1, 2, 3); // expected-error {{no matching}}
70*67e74705SXin Li     for (auto x : s) {
71*67e74705SXin Li       // We used to attempt to evaluate the initializer of this variable,
72*67e74705SXin Li       // and crash because it has an undeduced type.
73*67e74705SXin Li       const int &n(x);
74*67e74705SXin Li     }
75*67e74705SXin Li   }
76*67e74705SXin Li }
77*67e74705SXin Li 
78*67e74705SXin Li namespace incorrect_auto_type_deduction_for_typo {
79*67e74705SXin Li struct S {
Sincorrect_auto_type_deduction_for_typo::S80*67e74705SXin Li   template <typename T> S(T t) {
81*67e74705SXin Li     (void)sizeof(t);
82*67e74705SXin Li     (void)new auto(t);
83*67e74705SXin Li   }
84*67e74705SXin Li };
85*67e74705SXin Li 
86*67e74705SXin Li void Foo(S);
87*67e74705SXin Li 
test(int some_number)88*67e74705SXin Li void test(int some_number) {  // expected-note {{'some_number' declared here}}
89*67e74705SXin Li   auto x = sum_number;  // expected-error {{use of undeclared identifier 'sum_number'; did you mean 'some_number'?}}
90*67e74705SXin Li   auto lambda = [x] {};
91*67e74705SXin Li   Foo(lambda);
92*67e74705SXin Li }
93*67e74705SXin Li }
94