1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> T f0(T); 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint f0(int); 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- an object or reference being initialized 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct S { 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (*f0)(int); 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (*f1)(float); 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_init_f0() { 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (*f0a)(int) = f0; 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (*f0b)(int) = &f0; 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (*f0c)(int) = (f0); 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (*f0d)(float) = f0; 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (*f0e)(float) = &f0; 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (*f0f)(float) = (f0); 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (&f0g)(int) = f0; 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (&f0h)(int) = (f0); 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (&f0i)(float) = f0; 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (&f0j)(float) = (f0); 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao S s = { f0, f0 }; 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- the left side of an assignment (5.17), 27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_assign_f0() { 28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int (*f0a)(int) = 0; 29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao float (*f0b)(float) = 0; 30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0a = f0; 32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0a = &f0; 33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0a = (f0); 34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0b = f0; 35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0b = &f0; 36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao f0b = (f0); 37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- a parameter of a function (5.2.2), 40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid eat_f0(int a(int), float (*b)(float), int (&c)(int), float (&d)(float)); 41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_pass_f0() { 43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao eat_f0(f0, f0, f0, f0); 44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao eat_f0(&f0, &f0, (f0), (f0)); 45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- a parameter of a user-defined operator (13.5), 48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X { }; 49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator+(X, int(int)); 50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator-(X, float(*)(float)); 51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator*(X, int (&)(int)); 52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator/(X, float (&)(float)); 53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_operator_pass_f0(X x) { 55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x + f0; 56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x + &f0; 57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x - f0; 58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x - &f0; 59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x * f0; 60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x * (f0); 61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x / f0; 62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x / (f0); 63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- the return value of a function, operator function, or conversion (6.6.3), 66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint (*test_return_f0_a())(int) { return f0; } 67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint (*test_return_f0_b())(int) { return &f0; } 68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint (*test_return_f0_c())(int) { return (f0); } 69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaofloat (*test_return_f0_d())(float) { return f0; } 70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaofloat (*test_return_f0_e())(float) { return &f0; } 71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaofloat (*test_return_f0_f())(float) { return (f0); } 72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- an explicit type conversion (5.2.3, 5.2.9, 5.4), or 74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_convert_f0() { 75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((int (*)(int))f0); 76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((int (*)(int))&f0); 77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((int (*)(int))(f0)); 78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((float (*)(float))f0); 79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((float (*)(float))&f0); 80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)((float (*)(float))(f0)); 81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// -- a non-type template-parameter(14.3.2). 84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int(int)> struct Y0 { }; 85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<float(float)> struct Y1 { }; 86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int (&)(int)> struct Y2 { }; 87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<float (&)(float)> struct Y3 { }; 88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY0<f0> y0; 90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY0<&f0> y0a; 91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY1<f0> y1; 92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY1<&f0> y1a; 93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY2<f0> y2; 94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoY3<f0> y3; 95