Protoc will successfully generate C++ code, that cannot be compiled afterwards. If a message is named "target", "base" or "stream" the generated code will contain naming collision with internally used arguments of the same name. I expect that protoc would either produce an error, or emit correct code. A proposed fix is in PR #24204