xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-large-by-value-copy.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fsyntax-only -Wlarge-by-value-copy=100 %s
2*67e74705SXin Li 
3*67e74705SXin Li // rdar://8548050
4*67e74705SXin Li namespace rdar8548050 {
5*67e74705SXin Li 
6*67e74705SXin Li struct S100 {
7*67e74705SXin Li     char x[100];
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct S101 {
11*67e74705SXin Li     char x[101];
12*67e74705SXin Li };
13*67e74705SXin Li 
f100(S100 s)14*67e74705SXin Li S100 f100(S100 s) { return s; }
15*67e74705SXin Li 
f101(S101 s)16*67e74705SXin Li S101 f101(S101 s) { return s; } // expected-warning {{return value of 'f101' is a large (101 bytes) pass-by-value object}} \
17*67e74705SXin Li                                 // expected-warning {{'s' is a large (101 bytes) pass-by-value argument}}
18*67e74705SXin Li 
19*67e74705SXin Li typedef int Arr[200];
farr(Arr a)20*67e74705SXin Li void farr(Arr a) { }
21*67e74705SXin Li 
22*67e74705SXin Li struct NonPOD {
23*67e74705SXin Li   char x[200];
24*67e74705SXin Li   virtual void m();
25*67e74705SXin Li };
26*67e74705SXin Li 
fNonPOD(NonPOD s)27*67e74705SXin Li NonPOD fNonPOD(NonPOD s) { return s; }
28*67e74705SXin Li 
29*67e74705SXin Li template <unsigned size>
30*67e74705SXin Li struct TS {
31*67e74705SXin Li     char x[size];
32*67e74705SXin Li };
33*67e74705SXin Li 
34*67e74705SXin Li template <unsigned size>
tf(TS<size> ts)35*67e74705SXin Li void tf(TS<size> ts) {} // expected-warning {{ts' is a large (300 bytes) pass-by-value argument}}
36*67e74705SXin Li 
g()37*67e74705SXin Li void g() {
38*67e74705SXin Li     TS<300> ts;
39*67e74705SXin Li     tf<300>(ts); // expected-note {{instantiation}}
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li template<typename T> class DependentPOD {
45*67e74705SXin Li   enum b { x };
foo()46*67e74705SXin Li   b foo() { return x; }
47*67e74705SXin Li };
48