--- /dev/null
+// { 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
--- /dev/null
+/* { 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 "" } */
+}