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