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