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 | |