diff --git a/sv-parser-error/src/lib.rs b/sv-parser-error/src/lib.rs index d6f3ccf..56fd305 100644 --- a/sv-parser-error/src/lib.rs +++ b/sv-parser-error/src/lib.rs @@ -15,6 +15,9 @@ pub enum Error { path: PathBuf, }, + #[error("File could not be read as UTF8: {0:?}")] + ReadUtf8(PathBuf), + #[error("Include error")] Include { #[from] @@ -34,7 +37,7 @@ pub enum Error { DefineNotFound(String), #[error("Define must have argument")] - DefineNoArgs, + DefineNoArgs(String), // String is the macro identifier. #[error("Exceed recursive limit")] ExceedRecursiveLimit, diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 58b7d34..9a01eff 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -149,18 +149,21 @@ fn preprocess_inner, U: AsRef, V: BuildHasher>( })?; let mut reader = BufReader::new(f); let mut s = String::new(); - reader.read_to_string(&mut s)?; - preprocess_str( - &s, - path, - pre_defines, - include_paths, - ignore_include, - strip_comments, - 0, // resolve_depth - include_depth, - ) + if let Err(_) = reader.read_to_string(&mut s) { + Err(Error::ReadUtf8(PathBuf::from(path.as_ref()))) + } else { + preprocess_str( + &s, + path, + pre_defines, + include_paths, + ignore_include, + strip_comments, + 0, // resolve_depth + include_depth, + ) + } } struct SkipNodes<'a> { @@ -942,7 +945,7 @@ fn resolve_text_macro_usage, U: AsRef>( let mut arg_map = HashMap::new(); if !define.arguments.is_empty() && no_args { - return Err(Error::DefineNoArgs); + return Err(Error::DefineNoArgs(define.identifier.clone())); } for (i, (arg, default)) in define.arguments.iter().enumerate() { @@ -1065,6 +1068,73 @@ mod tests { ); } // }}} + #[test] + #[allow(non_snake_case)] + fn err_DefineNoArgs() { // {{{ + match preprocess_usualargs("err_DefineNoArgs.sv").unwrap_err() { + Error::DefineNoArgs(identifier) => { + assert_eq!( + identifier, + String::from("A") + ); + } + _ => { + panic!("Error::DefineNoArgs not raised."); + } + }; + } // }}} + + #[test] + #[allow(non_snake_case)] + fn err_DefineNotFound() { // {{{ + match preprocess_usualargs("err_DefineNotFound.sv").unwrap_err() { + Error::DefineNotFound(identifier) => { + assert_eq!( + identifier, + String::from("A") + ); + } + _ => { + panic!("Error::DefineNotFound not raised."); + } + }; + } // }}} + + #[test] + #[allow(non_snake_case)] + fn err_DefineArgNotFound() { // {{{ + match preprocess_usualargs("err_DefineArgNotFound.sv").unwrap_err() { + Error::DefineArgNotFound(identifier) => { + assert_eq!( + identifier, + String::from("c") + ); + } + _ => { + panic!("Error::DefineArgNotFound not raised."); + } + }; + } // }}} + + #[test] + #[allow(non_snake_case)] + fn err_ReadUtf8() { // {{{ + match preprocess_usualargs("err_ReadUtf8.sv").unwrap_err() { + Error::ReadUtf8(path) => { + assert_eq!( + path, + PathBuf::from(format!( + "{}/testcases/err_ReadUtf8.sv", + env::var("CARGO_MANIFEST_DIR").unwrap(), + )) + ); + } + _ => { + panic!("Error::ReadUtf8 not raised."); + } + }; + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ diff --git a/sv-parser-pp/testcases/err_DefineArgNotFound.sv b/sv-parser-pp/testcases/err_DefineArgNotFound.sv new file mode 100644 index 0000000..c2fe5c0 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineArgNotFound.sv @@ -0,0 +1,5 @@ +/* IEEE1800-2017 Clause 22.5.1 top of page 678 +*/ +`define MACRO1(a=5,b="B",c) $display(a,,b,,c); +`MACRO1(1) // Macro called without required argument `c`. + diff --git a/sv-parser-pp/testcases/err_DefineNoArgs.sv b/sv-parser-pp/testcases/err_DefineNoArgs.sv new file mode 100644 index 0000000..e6ec824 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineNoArgs.sv @@ -0,0 +1,4 @@ + +`define A(a) +`A // Macro called without required argument. + diff --git a/sv-parser-pp/testcases/err_DefineNotFound.sv b/sv-parser-pp/testcases/err_DefineNotFound.sv new file mode 100644 index 0000000..1ffd213 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineNotFound.sv @@ -0,0 +1,3 @@ + +`A // Macro called without definition. + diff --git a/sv-parser-pp/testcases/err_ReadUtf8.sv b/sv-parser-pp/testcases/err_ReadUtf8.sv new file mode 100644 index 0000000..f47cf3c --- /dev/null +++ b/sv-parser-pp/testcases/err_ReadUtf8.sv @@ -0,0 +1,4 @@ +// In the next comment, there are non-UTF8 bytes. +module M; +// Non-UTF8:XñòóôõöX +endmodule