From 2ca1282f84c5da41328b1251ac7bbcfa417b9be6 Mon Sep 17 00:00:00 2001 From: François Pottier Date: Tue, 3 Nov 2015 10:32:55 +0100 Subject: When printing a fragment of source text as part of an error message, compress multiple whitespace characters into just one space character. This is done before the call to [sanitize], which replaces special characters with a dot. This produces more a readable result when the error spans multiple lines. --- cparser/ErrorReports.ml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'cparser') diff --git a/cparser/ErrorReports.ml b/cparser/ErrorReports.ml index 4bbf3ded..a8976e42 100644 --- a/cparser/ErrorReports.ml +++ b/cparser/ErrorReports.ml @@ -92,6 +92,14 @@ let extract text (pos1, pos2) : string = (* -------------------------------------------------------------------------- *) +(* [compress text] replaces every run of at least one whitespace character + with exactly one space character. *) + +let compress text = + Str.global_replace (Str.regexp "[ \t\n\r]+") " " text + +(* -------------------------------------------------------------------------- *) + (* [sanitize text] eliminates any special characters from the text [text]. They are (arbitrarily) replaced with a single dot character. *) @@ -182,7 +190,7 @@ let range text (e : element) : string = (* Get the underlying source text fragment. *) let fragment = extract text (pos1, pos2) in (* Sanitize it and limit its length. Enclose it in single quotes. *) - "'" ^ shorten width (sanitize fragment) ^ "'" + "'" ^ shorten width (sanitize (compress fragment)) ^ "'" (* -------------------------------------------------------------------------- *) -- cgit From d9584e32f6b6f3a44d54615c97a5998c0ba6dfd5 Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Fri, 6 Nov 2015 14:18:31 +0100 Subject: Remove debug stmts during grouping of switch. Debug statements introduced during the translation result in warnings when they are introduced at the head of the switch. Since they are not used and the warning is not necessary we can remove them before. Fix 17580. --- cparser/Cutil.ml | 16 ++++++++++++---- cparser/Cutil.mli | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'cparser') diff --git a/cparser/Cutil.ml b/cparser/Cutil.ml index a86c779f..1b0bf65d 100644 --- a/cparser/Cutil.ml +++ b/cparser/Cutil.ml @@ -880,6 +880,18 @@ let is_literal_0 e = | EConst(CInt(0L, _, _)) -> true | _ -> false +(* Check that a C statement is a debug annotation *) + +let is_debug_stmt s = + let is_debug_call = function + | (ECall ({edesc = EVar id; _},_)) -> id.name = "__builtin_debug" + | _ -> false in + match s.sdesc with + | Sdo {edesc = e;_} -> + is_debug_call e + | _ -> false + + (* Assignment compatibility check over attributes. Standard attributes ("const", "volatile", "restrict") can safely be added (to the rhs type to get the lhs type) but must not be dropped. @@ -1099,7 +1111,3 @@ let rec subst_stmt phi s = List.map subst_asm_operand inputs, clob) } - - - - diff --git a/cparser/Cutil.mli b/cparser/Cutil.mli index 8b6c609b..b353cba3 100644 --- a/cparser/Cutil.mli +++ b/cparser/Cutil.mli @@ -187,6 +187,8 @@ val type_of_member : Env.t -> field -> typ (* Return the type of accessing the given field [fld]. Normally it's [fld.fld_type] but there is a special case for small unsigned bitfields. *) +val is_debug_stmt : stmt -> bool + (* Is the given statement a call to debug builtin? *) val is_literal_0 : exp -> bool (* Is the given expression the integer literal "0"? *) val is_lvalue : exp -> bool -- cgit