+2017-01-31 David Malcolm <dmalcolm@redhat.com>
+
+ PR preprocessor/79210
+ * input.c (get_substring_ranges_for_loc): Replace line_width
+ assertion with error-handling.
+
2017-01-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/77318
const char *literal = line + start.column - 1;
int literal_length = finish.column - start.column + 1;
- gcc_assert (line_width >= (start.column - 1 + literal_length));
+ /* Ensure that we don't crash if we got the wrong location. */
+ if (line_width < (start.column - 1 + literal_length))
+ return "line is not wide enough";
+
cpp_string from;
from.len = literal_length;
/* Make a copy of the literal, to avoid having to rely on
+2017-01-31 David Malcolm <dmalcolm@redhat.com>
+
+ PR preprocessor/79210
+ * gcc.dg/format/pr79210.c: New test case.
+ * gcc.dg/plugin/diagnostic-test-string-literals-2.c (test_pr79210):
+ New function.
+
2017-01-31 Nathan Sidwell <nathan@acm.org>
PR c++/79290
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wformat -Wformat-signedness" } */
+
+__attribute__((format(printf, 3, 4)))
+void dev_printk(const char *level, void *dev, const char *fmt, ...);
+
+#define lpfc_vport_param_init(attr) \
+void lpfc_##attr##_init(void *vport, unsigned int val) \
+{ \
+ dev_printk("3", (void *)0, \
+ "0423 lpfc_"#attr" attribute cannot be set to %d, "\
+ "allowed range is [0, 1]\n", val); \
+}
+
+#define LPFC_VPORT_ATTR_R(name, desc) \
+unsigned int lpfc_##name;\
+lpfc_vport_param_init(name)\
+
+LPFC_VPORT_ATTR_R(peer_port_login,
+ "Allow peer ports on the same physical port to login to each "
+ "other.");
+
+/* { dg-warning "6: format .%d. expects argument of type .int., but argument 4 has type .unsigned int. " "" { target *-*-* } .-12 } */
#undef FOO
}
+/* Test of a stringified macro argument within a concatenation. */
+
+void
+test_pr79210 (void)
+{
+#define lpfc_vport_param_init(attr) \
+ __emit_string_literal_range ( \
+ "0423 lpfc_"#attr" attribute cannot be set to %d, "\
+ "allowed range is [0, 1]\n", 54, 53, 54) \
+
+#define LPFC_VPORT_ATTR_R(name, decc) \
+ unsigned int lpfc_##name; \
+ lpfc_vport_param_init(name) \
+
+ LPFC_VPORT_ATTR_R(peer_port_login,
+ "some multiline blurb with a short final line "
+ "here");
+
+ /* { dg-error "19: unable to read substring location: line is not wide enough" "" { target *-*-* } .-11 } */
+
+#undef LPFC_VPORT_ATTR_R
+#undef lpfc_vport_param_init
+}