// RUN: %clang_cc1 -fsyntax-only -verify=both,expected %s
// RUN: %clang_cc1 -fsyntax-only -Wstrict-prototypes -verify=both,strict %s
// Test both with and without -Wstrict-prototypes because there are complicated
// interactions between it and -Wdeprecated-non-prototype.
// Off by default warnings, enabled by -pedantic or -Wstrict-prototypes
void other_func(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void other_func() {} // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void never_defined(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
typedef void (*fp)(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void blerp(
void (*func_ptr)() // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
);
void whatever(void) {
extern void hoo_boy(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
}
void again() {} // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
// On by default warnings
void func(); // both-warning {{a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C23, conflicting with a subsequent definition}} \
strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void func(a, b) int a, b; {} // both-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}}
void one_more(a, b) int a, b; {} // both-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}}
void sheesh(int a);
void sheesh(a) int a; {} // both-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}}
void another(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
int main(void) {
another(1, 2); // both-warning {{passing arguments to 'another' without a prototype is deprecated in all versions of C and is not supported in C23}}
}
void order1(); // both-warning {{a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C23, conflicting with a subsequent declaration}} \
strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void order1(int i); // both-note {{conflicting prototype is here}}
void order2(int i); // both-note {{conflicting prototype is here}}
void order2(); // both-warning {{a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C23, conflicting with a previous declaration}} \
strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void order3(); // both-warning {{a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C23, conflicting with a subsequent definition}} \
strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
void order3(int i) {} // both-note {{conflicting prototype is here}}
// Just because the prototype is variadic doesn't mean we shouldn't warn on the
// K&R C function definition; this still changes behavior in C23.
void test(char*,...);
void test(fmt) // both-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}}
char*fmt;
{
}
void blapp(int); // both-note {{previous declaration is here}}
void blapp() { } // both-error {{conflicting types for 'blapp'}} \
// strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
// Disable -Wdeprecated-non-prototype
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-non-prototype"
void depr_non_prot(); // strict-warning {{a function declaration without a prototype is deprecated in all versions of C}}
#pragma GCC diagnostic pop
// Reenable it.
// Disable -Wstrict-prototypes
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
void strict_prot(); // OK
#pragma GCC diagnostic pop
// Reenable it.
void calls(void) {
// Ensure that we diagnose calls to functions without a prototype, but only
// if they pass arguments.
never_defined(); // OK
never_defined(1); // both-warning {{passing arguments to 'never_defined' without a prototype is deprecated in all versions of C and is not supported in C23}}
// Ensure that calls to builtins without a traditional prototype are not
// diagnosed.
(void)__builtin_isless(1.0, 1.0); // OK
// Calling a function whose prototype was provided by a function with an
// identifier list is still fine.
func(1, 2); // OK
// Ensure that a call through a function pointer is still diagnosed properly.
fp f;
f(); // OK
f(1, 2); // both-warning {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23}}
// Ensure that we don't diagnose when the diagnostic group is disabled.
depr_non_prot(1); // OK
strict_prot(1); // OK
// Ensure we don't issue diagnostics if the function without a prototype was
// later given a prototype by a definintion. Also ensure we don't duplicate
// diagnostics if such a call is incorrect.
func(1, 2); // OK
func(1, 2, 3); // both-warning {{too many arguments in call to 'func'}}
}
// Issue 58181 -- we would issue the warning about the function without a
// prototype twice when the function was declared static in the following
// example.
static int GH58181(int x, int y);
static int GH58181(x, y) // both-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}}
int x;
int y;
{
return x + y;
}