// RUN: %clang_cc1 -verify -fsyntax-only -Wlarge-by-value-copy=100 %s namespace rdar8548050 { struct S100 { char x[100]; }; struct S101 { char x[101]; }; S100 f100(S100 s) { return s; } S101 f101(S101 s) { return s; } // expected-warning {{return value of 'f101' is a large (101 bytes) pass-by-value object}} \ // expected-warning {{'s' is a large (101 bytes) pass-by-value argument}} void f101_no_param_name(S101) {} // expected-warning {{'' is a large (101 bytes) pass-by-value argument}} // FIXME: Don't warn when when the return value is subject to (N)RVO. template T foo_template(T); template <> S101 foo_template(S101) { return S101(); } // expected-warning {{return value of 'foo_template' is a large}} // expected-warning@-1 {{'' is a large (101 bytes) pass-by-value argument}} typedef int Arr[200]; void farr(Arr a) { } struct NonPOD { char x[200]; virtual void m(); }; NonPOD fNonPOD(NonPOD s) { return s; } template struct TS { char x[size]; }; template void tf(TS ts) {} // expected-warning {{ts' is a large (300 bytes) pass-by-value argument}} void g() { TS<300> ts; tf<300>(ts); // expected-note {{instantiation}} } } template class DependentPOD { enum b { x }; b foo() { return x; } };