diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-08-23 15:53:41 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-08-23 15:53:41 +0000 |
commit | 397ecd0556e5a480b90d9ffdf57bad9a18e57431 (patch) | |
tree | 1b2221267485718efa7fedb17c68410d3d510b39 | |
parent | b7fbf563809308a66911d0300b42c5522fdd835f (diff) | |
download | gcc-397ecd0556e5a480b90d9ffdf57bad9a18e57431.zip gcc-397ecd0556e5a480b90d9ffdf57bad9a18e57431.tar.gz gcc-397ecd0556e5a480b90d9ffdf57bad9a18e57431.tar.bz2 |
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
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/param-type-mismatch.C | 179 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/param-type-mismatch.c | 63 |
3 files changed, 247 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 940155a..c9c7193 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-23 David Malcolm <dmalcolm@redhat.com> + + * g++.dg/diagnostic/param-type-mismatch.C: New test acse. + * gcc.dg/param-type-mismatch.c: New test case. + 2017-08-23 Will Schmidt <will_schmidt@vnet.ibm.com> * 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 0000000..b8833ef --- /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 <typename T> +int test_7 (int one, T two, float three); + +int test_7 (int first, int second, float third) +{ + return test_7 <const char *> (first, second, third); // { dg-error "no matching function" } + /* { dg-begin-multiline-output "" } + return test_7 <const char *> (first, second, third); + ^ + { dg-end-multiline-output "" } */ + /* { dg-begin-multiline-output "" } + return test_7 <const char *> (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 <typename T> +struct s8 { static int member_1 (int one, T two, float three); }; + +int test_8 (int first, int second, float third) +{ + return s8 <const char *>::member_1 (first, second, third); // { dg-error "invalid conversion from 'int' to 'const char\\*'" } + /* { dg-begin-multiline-output "" } + return s8 <const char *>::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 <typename T> +struct s9 { int member_1 (int one, T two, float three); }; + +int test_9 (int first, int second, float third) +{ + s9 <const char *> 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 0000000..70ea0bc --- /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 "" } */ +} |