+2018-11-30 David Malcolm <dmalcolm@redhat.com>
+
+ * diagnostic-core.h (emit_diagnostic): New decl.
+ * diagnostic.c (emit_diagnostic): New overload, taking a
+ rich_location *.
+
2018-11-30 David Malcolm <dmalcolm@redhat.com>
* pretty-print.c (class selftest::test_pretty_printer): New
+2018-11-30 David Malcolm <dmalcolm@redhat.com>
+
+ * typeck2.c: Include "gcc-rich-location.h".
+ (cxx_incomplete_type_diagnostic): When complaining about possibly
+ missing parens, add a fix-it hint if the member function takes no
+ additional params.
+
2018-11-30 James Norris <jnorris@codesourcery.com>
* parser.c (cp_parser_oacc_enter_exit_data): Use existing local
#include "stor-layout.h"
#include "varasm.h"
#include "intl.h"
+#include "gcc-rich-location.h"
static tree
process_init_constructor (tree type, tree init, int nested,
if (DECL_FUNCTION_MEMBER_P (member)
&& ! flag_ms_extensions)
- emit_diagnostic (diag_kind, loc, 0,
- "invalid use of member function %qD "
- "(did you forget the %<()%> ?)", member);
+ {
+ gcc_rich_location richloc (loc);
+ /* If "member" has no arguments (other than "this"), then
+ add a fix-it hint. */
+ if (type_num_arguments (TREE_TYPE (member)) == 1)
+ richloc.add_fixit_insert_after ("()");
+ emit_diagnostic (diag_kind, &richloc, 0,
+ "invalid use of member function %qD "
+ "(did you forget the %<()%> ?)", member);
+ }
else
emit_diagnostic (diag_kind, loc, 0,
"invalid use of member %qD "
extern void verbatim (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
extern bool emit_diagnostic (diagnostic_t, location_t, int,
const char *, ...) ATTRIBUTE_GCC_DIAG(4,5);
+extern bool emit_diagnostic (diagnostic_t, rich_location *, int,
+ const char *, ...) ATTRIBUTE_GCC_DIAG(4,5);
extern bool emit_diagnostic_valist (diagnostic_t, location_t, int, const char *,
va_list *) ATTRIBUTE_GCC_DIAG (4,0);
extern bool seen_error (void);
return ret;
}
+/* As above, but for rich_location *. */
+
+bool
+emit_diagnostic (diagnostic_t kind, rich_location *richloc, int opt,
+ const char *gmsgid, ...)
+{
+ auto_diagnostic_group d;
+ va_list ap;
+ va_start (ap, gmsgid);
+ bool ret = diagnostic_impl (richloc, opt, gmsgid, &ap, kind);
+ va_end (ap);
+ return ret;
+}
+
/* Wrapper around diagnostic_impl taking a va_list parameter. */
bool
+2018-11-30 David Malcolm <dmalcolm@redhat.com>
+
+ * g++.dg/parse/missing-parens-fixit.C: New test.
+
2018-11-30 Michael Ploujnikov <michael.ploujnikov@oracle.com>
* gcc.dg/independent-cloneids-1.c: New test.
--- /dev/null
+// { dg-options "-fdiagnostics-show-caret" }
+
+class t1
+{
+public:
+ double length () const { return m_length; }
+ double area (double width) const { return m_length * width; }
+
+private:
+ double m_length;
+};
+
+bool test_1 (const t1 &inst)
+{
+ return inst.length > 0.0; // { dg-error "did you forget the '\\(\\)'" }
+ /* We expect a fix-it hint. */
+ /* { dg-begin-multiline-output "" }
+ return inst.length > 0.0;
+ ~~~~~^~~~~~
+ ()
+ { dg-end-multiline-output "" } */
+}
+
+bool test_2 (const t1 &inst)
+{
+ return inst.area > 0.0; // { dg-error "did you forget the '\\(\\)'" }
+ /* "t1::area" has additional params, so we don't expect a fix-it hint. */
+ /* { dg-begin-multiline-output "" }
+ return inst.area > 0.0;
+ ~~~~~^~~~
+ { dg-end-multiline-output "" } */
+}