From 397ecd0556e5a480b90d9ffdf57bad9a18e57431 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 23 Aug 2017 15:53:41 +0000 Subject: [PATCH] testsuite: add param-type-mismatch.c/C testcases as a baseline gcc/testsuite/ChangeLog: * g++.dg/diagnostic/param-type-mismatch.C: New test acse. * gcc.dg/param-type-mismatch.c: New test case. From-SVN: r251312 --- gcc/testsuite/ChangeLog | 5 + .../g++.dg/diagnostic/param-type-mismatch.C | 179 ++++++++++++++++++ gcc/testsuite/gcc.dg/param-type-mismatch.c | 63 ++++++ 3 files changed, 247 insertions(+) create mode 100644 gcc/testsuite/g++.dg/diagnostic/param-type-mismatch.C create mode 100644 gcc/testsuite/gcc.dg/param-type-mismatch.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 940155ad01f..c9c71934a7c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-23 David Malcolm + + * g++.dg/diagnostic/param-type-mismatch.C: New test acse. + * gcc.dg/param-type-mismatch.c: New test case. + 2017-08-23 Will Schmidt * gcc.target/powerpc/fold-vec-perm-char.c: New. diff --git a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch.C b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch.C new file mode 100644 index 00000000000..b8833ef1372 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch.C @@ -0,0 +1,179 @@ +// { dg-options "-fdiagnostics-show-caret" } + +/* A collection of calls where argument 2 is of the wrong type. + + TODO: we should put the caret and underline for the diagnostic + at the second argument, rather than the close paren. + + TODO: we should highlight the second parameter of the callee, rather + than its name. */ + +/* decl, with argname. */ + +extern int callee_1 (int one, const char *two, float three); // { dg-line callee_1 } + +int test_1 (int first, int second, float third) +{ + return callee_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return callee_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_1\\(int, const char\\*, float\\)'" "" { target *-*-* } callee_1 } + /* { dg-begin-multiline-output "" } + extern int callee_1 (int one, const char *two, float three); + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* decl, without argname. */ + +extern int callee_2 (int, const char *, float); // { dg-line callee_2 } + +int test_2 (int first, int second, float third) +{ + return callee_2 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return callee_2 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_2\\(int, const char\\*, float\\)'" "" { target *-*-* } callee_2 } + /* { dg-begin-multiline-output "" } + extern int callee_2 (int, const char *, float); + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* defn, with argname. */ + +static int callee_3 (int one, const char *two, float three) // { dg-line callee_3 } +{ + return callee_2 (one, two, three); +} + +int test_3 (int first, int second, float third) +{ + return callee_3 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return callee_3 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_3\\(int, const char\\*, float\\)'" "" { target *-*-* } callee_3 } + /* { dg-begin-multiline-output "" } + static int callee_3 (int one, const char *two, float three) + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* static member, with argname. */ + +struct s4 { static int member_1 (int one, const char *two, float three); }; + +int test_4 (int first, int second, float third) +{ + return s4::member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return s4::member_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + struct s4 { static int member_1 (int one, const char *two, float three); }; + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* non-static member, with argname. */ + +struct s5 { int member_1 (int one, const char *two, float three); }; + +int test_5 (int first, int second, float third) +{ + s5 inst; + return inst.member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return inst.member_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + struct s5 { int member_1 (int one, const char *two, float three); }; + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* non-static member, with argname, via a ptr. */ + +struct s6 { int member_1 (int one, const char *two, float three); }; + +int test_6 (int first, int second, float third, s6 *ptr) +{ + return ptr->member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return ptr->member_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + struct s6 { int member_1 (int one, const char *two, float three); }; + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* Template function. */ + +template +int test_7 (int one, T two, float three); + +int test_7 (int first, int second, float third) +{ + return test_7 (first, second, third); // { dg-error "no matching function" } + /* { dg-begin-multiline-output "" } + return test_7 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + return test_7 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + int test_7 (int one, T two, float three); + ^~~~~~ + { dg-end-multiline-output "" } */ +} + +/* Template class, static function. */ + +template +struct s8 { static int member_1 (int one, T two, float three); }; + +int test_8 (int first, int second, float third) +{ + return s8 ::member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return s8 ::member_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + struct s8 { static int member_1 (int one, T two, float three); }; + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* Template class, non-static function. */ + +template +struct s9 { int member_1 (int one, T two, float three); }; + +int test_9 (int first, int second, float third) +{ + s9 inst; + return inst.member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return inst.member_1 (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + struct s9 { int member_1 (int one, T two, float three); }; + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +// TODO: template callsite diff --git a/gcc/testsuite/gcc.dg/param-type-mismatch.c b/gcc/testsuite/gcc.dg/param-type-mismatch.c new file mode 100644 index 00000000000..70ea0bc268b --- /dev/null +++ b/gcc/testsuite/gcc.dg/param-type-mismatch.c @@ -0,0 +1,63 @@ +/* { dg-options "-fdiagnostics-show-caret" } */ + +/* A collection of calls where argument 2 is of the wrong type. + + TODO: we should highlight the second parameter of the callee, rather + than its name. */ + +/* decl, with argname. */ + +extern int callee_1 (int one, const char *two, float three); /* { dg-line callee_1 } */ + +int test_1 (int first, int second, float third) +{ + return callee_1 (first, second, third); /* { dg-warning "passing argument 2 of 'callee_1' makes pointer from integer without a cast" } */ + /* { dg-begin-multiline-output "" } + return callee_1 (first, second, third); + ^~~~~~ + { dg-end-multiline-output "" } */ + /* { dg-message "expected 'const char \\*' but argument is of type 'int'" "" { target *-*-* } callee_1 } */ + /* { dg-begin-multiline-output "" } + extern int callee_1 (int one, const char *two, float three); + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* decl, without argname. */ + +extern int callee_2 (int, const char *, float); /* { dg-line callee_2 } */ + +int test_2 (int first, int second, float third) +{ + return callee_2 (first, second, third); /* { dg-warning "passing argument 2 of 'callee_2' makes pointer from integer without a cast" } */ + /* { dg-begin-multiline-output "" } + return callee_2 (first, second, third); + ^~~~~~ + { dg-end-multiline-output "" } */ + /* { dg-message "expected 'const char \\*' but argument is of type 'int'" "" { target *-*-* } callee_2 } */ + /* { dg-begin-multiline-output "" } + extern int callee_2 (int, const char *, float); + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} + +/* defn, with argname. */ + +static int callee_3 (int one, const char *two, float three) /* { dg-line callee_3 } */ +{ + return callee_2 (one, two, three); +} + +int test_3 (int first, int second, float third) +{ + return callee_3 (first, second, third); // { dg-warning "passing argument 2 of 'callee_3' makes pointer from integer without a cast" } + /* { dg-begin-multiline-output "" } + return callee_3 (first, second, third); + ^~~~~~ + { dg-end-multiline-output "" } */ + /* { dg-message "expected 'const char \\*' but argument is of type 'int'" "" { target *-*-* } callee_3 } */ + /* { dg-begin-multiline-output "" } + static int callee_3 (int one, const char *two, float three) + ^~~~~~~~ + { dg-end-multiline-output "" } */ +} -- 2.30.2