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 LiS100 f100(S100 s) { return s; } 15*67e74705SXin Li f101(S101 s)16*67e74705SXin LiS101 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 Livoid 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 LiNonPOD 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 Livoid tf(TS<size> ts) {} // expected-warning {{ts' is a large (300 bytes) pass-by-value argument}} 36*67e74705SXin Li g()37*67e74705SXin Livoid 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