Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions src/idl_gen_cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -682,16 +682,16 @@ class CppGenerator : public BaseGenerator {
code_.SetValue("ID", "nullptr");
}

code_ += "template <bool B = false>";
code_ += "template <bool VerifySizePrefixed = false>";
code_ += "inline bool Verify{{STRUCT_NAME}}Buffer(";
code_ += " ::flatbuffers::VerifierTemplate<B> &verifier) {";
code_ += " ::flatbuffers::VerifierTemplate<VerifySizePrefixed> &verifier) {";
code_ += " return verifier.template VerifyBuffer<{{CPP_NAME}}>({{ID}});";
code_ += "}";
code_ += "";

code_ += "template <bool B = false>";
code_ += "template <bool VerifySizePrefixed = false>";
code_ += "inline bool VerifySizePrefixed{{STRUCT_NAME}}Buffer(";
code_ += " ::flatbuffers::VerifierTemplate<B> &verifier) {";
code_ += " ::flatbuffers::VerifierTemplate<VerifySizePrefixed> &verifier) {";
code_ +=
" return "
"verifier.template "
Expand Down Expand Up @@ -1109,17 +1109,21 @@ class CppGenerator : public BaseGenerator {

// For the initial declaration, we specify the template parameters,
// including template default arguments.
std::string UnionVerifyTemplateDecl() { return "template <bool B = false>"; }
std::string UnionVerifyTemplateDecl() {
return "template <bool VerifySizePrefixed = false>";
}

// For the subsequent definition, we must not redeclare the template default
// arguments.
std::string UnionVerifyTemplateDef() { return "template <bool B>"; }
std::string UnionVerifyTemplateDef() {
return "template <bool VerifySizePrefixed>";
}

// Should be used in conjunction with
// UnionVerifyTemplateDecl()/UnionVerifyTemplateDef().
std::string UnionVerifySignature(const EnumDef& enum_def) {
return "bool Verify" + Name(enum_def) +
"(::flatbuffers::VerifierTemplate<B> &verifier, " +
"(::flatbuffers::VerifierTemplate<VerifySizePrefixed> &verifier, " +
"const void *obj, " + Name(enum_def) + " type)";
}

Expand All @@ -1131,7 +1135,7 @@ class CppGenerator : public BaseGenerator {
opts_.scoped_enums ? name
: GenTypeBasic(enum_def.underlying_type, false);
return "bool Verify" + name + "Vector" +
"(::flatbuffers::VerifierTemplate<B> &verifier, " +
"(::flatbuffers::VerifierTemplate<VerifySizePrefixed> &verifier, " +
"const ::flatbuffers::Vector<::flatbuffers::Offset<void>> "
"*values, " +
"const ::flatbuffers::Vector<" + type + "> *types)";
Expand Down Expand Up @@ -3148,9 +3152,9 @@ class CppGenerator : public BaseGenerator {

// Generate a verifier function that can check a buffer from an untrusted
// source will never cause reads outside the buffer.
code_ += " template <bool B = false>";
code_ += " template <bool VerifySizePrefixed = false>";
code_ +=
" bool Verify(::flatbuffers::VerifierTemplate<B> "
" bool Verify(::flatbuffers::VerifierTemplate<VerifySizePrefixed> "
"&verifier) const {";
code_ += " return VerifyTableStart(verifier)\\";
for (const auto& field : struct_def.fields.vec) {
Expand Down
31 changes: 31 additions & 0 deletions tests/test_cpp_field_name_collision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import subprocess
import sys
import tempfile
from pathlib import Path


SCHEMA = """namespace sample;
table Record { B:int; }
"""


def main() -> int:
if len(sys.argv) != 2:
raise SystemExit("usage: test_cpp_field_name_collision.py FLATC")
flatc = Path(sys.argv[1]).resolve()
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
schema = root / "collision.fbs"
schema.write_text(SCHEMA, encoding="utf-8")
result = subprocess.run([str(flatc), "--cpp", "-o", str(root), str(schema)], capture_output=True, text=True)
if result.returncode != 0:
raise AssertionError(result.stderr or result.stdout)
generated = root / "collision_generated.h"
compile_result = subprocess.run(["c++", "-std=c++11", "-fsyntax-only", "-I", "include", str(generated)], capture_output=True, text=True)
if compile_result.returncode != 0:
raise AssertionError(compile_result.stderr or compile_result.stdout)
return 0


if __name__ == "__main__":
raise SystemExit(main())