Skip to content

Commit

Permalink
Merge pull request #1513 from emilio/issue-1464
Browse files Browse the repository at this point in the history
ir: Ignore constructors with bogus spellings.
  • Loading branch information
emilio authored Feb 3, 2019
2 parents 86eff21 + 1ea12aa commit fa457f2
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 15 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 11 additions & 7 deletions csmith-fuzzing/predicate.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@

reducing = parser.add_argument_group("reducing arguments", REDUCING_DESC.strip())

reducing.add_argument(
"--release",
action="store_true",
help="Use a release instead of a debug build.")
reducing.add_argument(
"--expect-bindgen-fail",
action="store_true",
Expand Down Expand Up @@ -194,13 +198,13 @@ def run_bindgen(args, bindings):
manifest_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),
"..",
"Cargo.toml"))
child = run(
["cargo", "run",
"--manifest-path", manifest_path,
"--",
args.input, "-o", bindings] + shlex.split(args.bindgen_args),
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
command = ["cargo", "run", "--manifest-path", manifest_path]
if args.release:
command += ["--release"]
command += ["--", args.input, "-o", bindings]
command += shlex.split(args.bindgen_args)

child = run(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

if args.bindgen_grep:
pattern = regexp(args.bindgen_grep)
Expand Down
24 changes: 17 additions & 7 deletions src/ir/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,8 @@ impl FunctionSig {
debug!("FunctionSig::from_ty {:?} {:?}", ty, cursor);

// Skip function templates
if cursor.kind() == CXCursor_FunctionTemplate {
let kind = cursor.kind();
if kind == CXCursor_FunctionTemplate {
return Err(ParseError::Continue);
}

Expand All @@ -347,13 +348,22 @@ impl FunctionSig {
return Err(ParseError::Continue);
}

// Constructors of non-type template parameter classes for some reason
// include the template parameter in their name. Just skip them, since
// we don't handle well non-type template parameters anyway.
if (kind == CXCursor_Constructor || kind == CXCursor_Destructor) &&
spelling.contains('<')
{
return Err(ParseError::Continue);
}

let cursor = if cursor.is_valid() {
*cursor
} else {
ty.declaration()
};

let mut args: Vec<_> = match cursor.kind() {
let mut args: Vec<_> = match kind {
CXCursor_FunctionDecl |
CXCursor_Constructor |
CXCursor_CXXMethod |
Expand Down Expand Up @@ -397,9 +407,9 @@ impl FunctionSig {
let must_use =
ctx.options().enable_function_attribute_detection &&
cursor.has_simple_attr("warn_unused_result");
let is_method = cursor.kind() == CXCursor_CXXMethod;
let is_constructor = cursor.kind() == CXCursor_Constructor;
let is_destructor = cursor.kind() == CXCursor_Destructor;
let is_method = kind == CXCursor_CXXMethod;
let is_constructor = kind == CXCursor_Constructor;
let is_destructor = kind == CXCursor_Destructor;
if (is_constructor || is_destructor || is_method) &&
cursor.lexical_parent() != cursor.semantic_parent()
{
Expand Down Expand Up @@ -442,8 +452,8 @@ impl FunctionSig {
}
}

let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl ||
cursor.kind() == CXCursor_ObjCClassMethodDecl
let ty_ret_type = if kind == CXCursor_ObjCInstanceMethodDecl ||
kind == CXCursor_ObjCClassMethodDecl
{
ty.ret_type().or_else(|| cursor.ret_type()).ok_or(
ParseError::Continue,
Expand Down
8 changes: 8 additions & 0 deletions tests/expectations/tests/issue-1464.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/* automatically generated by rust-bindgen */

#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]
7 changes: 7 additions & 0 deletions tests/headers/issue-1464.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

// Should not crash.
template <int Foo> class Bar {
public:
Bar();
~Bar();
};
2 changes: 1 addition & 1 deletion tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ fn compare_generated_header(
expectation_file.write_all(actual.as_bytes())?;
}

Err(Error::new(ErrorKind::Other, "Header and binding differ!"))
Err(Error::new(ErrorKind::Other, "Header and binding differ! Run with BINDGEN_OVERWRITE_EXPECTED=1 in the environment to automatically overwrite the expectation."))
}

fn create_bindgen_builder(header: &PathBuf) -> Result<Option<Builder>, Error> {
Expand Down

0 comments on commit fa457f2

Please sign in to comment.