11380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis// RUN: %clang_cc1 -verify -fsyntax-only -Wlarge-by-value-copy=100 %s
23532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
33532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis// rdar://8548050
43532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisnamespace rdar8548050 {
53532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
63532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisstruct S100 {
73532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    char x[100];
83532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis};
93532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
103532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisstruct S101 {
113532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    char x[101];
123532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis};
133532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
143532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios KyrtzidisS100 f100(S100 s) { return s; }
153532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
161380a147d4578b619c215b23aa79ce17036d3c46Argyrios KyrtzidisS101 f101(S101 s) { return s; } // expected-warning {{return value of 'f101' is a large (101 bytes) pass-by-value object}} \
171380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis                                // expected-warning {{'s' is a large (101 bytes) pass-by-value argument}}
183532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
193532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidistypedef int Arr[200];
203532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisvoid farr(Arr a) { }
213532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
223532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisstruct NonPOD {
233532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis  char x[200];
243532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis  virtual void m();
253532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis};
263532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
273532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios KyrtzidisNonPOD fNonPOD(NonPOD s) { return s; }
283532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
293532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidistemplate <unsigned size>
303532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisstruct TS {
313532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    char x[size];
323532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis};
333532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
343532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidistemplate <unsigned size>
351380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidisvoid tf(TS<size> ts) {} // expected-warning {{ts' is a large (300 bytes) pass-by-value argument}}
363532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
373532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidisvoid g() {
383532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    TS<300> ts;
393532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    tf<300>(ts); // expected-note {{instantiation}}
403532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis}
413532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
423532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis}
43d18840d1e27c1b9c27bb74923b87f8ae33ec4736Eli Friedman
44d18840d1e27c1b9c27bb74923b87f8ae33ec4736Eli Friedmantemplate<typename T> class DependentPOD {
45d18840d1e27c1b9c27bb74923b87f8ae33ec4736Eli Friedman  enum b { x };
46d18840d1e27c1b9c27bb74923b87f8ae33ec4736Eli Friedman  b foo() { return x; }
47d18840d1e27c1b9c27bb74923b87f8ae33ec4736Eli Friedman};
48