Commit 86ba70ec authored by Bruce Dawson's avatar Bruce Dawson

Get VS 2015 to use const int definitions

VC++ up to VS 2015 RTM does not require explicit storage allocation for
static const integers declared in classes. VS 2015 Update 1 requires
these storage definitions in some cases. It's unclear exactly what
cases - simple tests work with and without the explicit storage
allocation.

Many previous versions of VC++ have theoretically *allowed* a
definition to supply storage, but tests on VC++ 2013 show that this
doesn't actually work correctly - it leads to duplicate definition
errors in Chromium. So, the change is scoped to VS 2015 only.

This change also updates the generated files to match the new generator.

TL;DR - this change is necessary in order for Chromium to build with
VS 2015 Update 1.
parent 86f6f53d
...@@ -278,9 +278,9 @@ void EnumGenerator::GenerateMethods(io::Printer* printer) { ...@@ -278,9 +278,9 @@ void EnumGenerator::GenerateMethods(io::Printer* printer) {
if (descriptor_->containing_type() != NULL) { if (descriptor_->containing_type() != NULL) {
// We need to "define" the static constants which were declared in the // We need to "define" the static constants which were declared in the
// header, to give the linker a place to put them. Or at least the C++ // header, to give the linker a place to put them. Or at least the C++
// standard says we have to. MSVC actually insists tha we do _not_ define // standard says we have to. MSVC actually insists that we do _not_ define
// them again in the .cc file. // them again in the .cc file, prior to VC++ 2015.
printer->Print("#ifndef _MSC_VER\n"); printer->Print("#if !defined(_MSC_VER) || _MSC_VER >= 1900\n");
vars["parent"] = ClassName(descriptor_->containing_type(), false); vars["parent"] = ClassName(descriptor_->containing_type(), false);
vars["nested_name"] = descriptor_->name(); vars["nested_name"] = descriptor_->name();
...@@ -297,7 +297,7 @@ void EnumGenerator::GenerateMethods(io::Printer* printer) { ...@@ -297,7 +297,7 @@ void EnumGenerator::GenerateMethods(io::Printer* printer) {
"const int $parent$::$nested_name$_ARRAYSIZE;\n"); "const int $parent$::$nested_name$_ARRAYSIZE;\n");
} }
printer->Print("#endif // _MSC_VER\n"); printer->Print("#endif // !defined(_MSC_VER) || _MSC_VER >= 1900\n");
} }
} }
......
...@@ -155,7 +155,7 @@ void ExtensionGenerator::GenerateDefinition(io::Printer* printer) { ...@@ -155,7 +155,7 @@ void ExtensionGenerator::GenerateDefinition(io::Printer* printer) {
// Likewise, class members need to declare the field constant variable. // Likewise, class members need to declare the field constant variable.
if (descriptor_->extension_scope() != NULL) { if (descriptor_->extension_scope() != NULL) {
printer->Print(vars, printer->Print(vars,
"#ifndef _MSC_VER\n" "#if !defined(_MSC_VER) || _MSC_VER >= 1900\n"
"const int $scope$$constant_name$;\n" "const int $scope$$constant_name$;\n"
"#endif\n"); "#endif\n");
} }
......
...@@ -1807,7 +1807,7 @@ GenerateClassMethods(io::Printer* printer) { ...@@ -1807,7 +1807,7 @@ GenerateClassMethods(io::Printer* printer) {
} }
// Generate field number constants. // Generate field number constants.
printer->Print("#ifndef _MSC_VER\n"); printer->Print("#if !defined(_MSC_VER) || _MSC_VER >= 1900\n");
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor *field = descriptor_->field(i); const FieldDescriptor *field = descriptor_->field(i);
printer->Print( printer->Print(
...@@ -1816,7 +1816,7 @@ GenerateClassMethods(io::Printer* printer) { ...@@ -1816,7 +1816,7 @@ GenerateClassMethods(io::Printer* printer) {
"constant_name", FieldConstantName(field)); "constant_name", FieldConstantName(field));
} }
printer->Print( printer->Print(
"#endif // !_MSC_VER\n" "#endif // !defined(_MSC_VER) || _MSC_VER >= 1900\n"
"\n"); "\n");
// Define extension identifiers. // Define extension identifiers.
......
...@@ -172,11 +172,11 @@ static void MergeFromFail(int line) { ...@@ -172,11 +172,11 @@ static void MergeFromFail(int line) {
// =================================================================== // ===================================================================
#ifndef _MSC_VER #if !defined(_MSC_VER) || _MSC_VER >= 1900
const int CodeGeneratorRequest::kFileToGenerateFieldNumber; const int CodeGeneratorRequest::kFileToGenerateFieldNumber;
const int CodeGeneratorRequest::kParameterFieldNumber; const int CodeGeneratorRequest::kParameterFieldNumber;
const int CodeGeneratorRequest::kProtoFileFieldNumber; const int CodeGeneratorRequest::kProtoFileFieldNumber;
#endif // !_MSC_VER #endif // !defined(_MSC_VER) || _MSC_VER >= 1900
CodeGeneratorRequest::CodeGeneratorRequest() CodeGeneratorRequest::CodeGeneratorRequest()
: ::google::protobuf::Message(), _internal_metadata_(NULL) { : ::google::protobuf::Message(), _internal_metadata_(NULL) {
...@@ -656,11 +656,11 @@ CodeGeneratorRequest::proto_file() const { ...@@ -656,11 +656,11 @@ CodeGeneratorRequest::proto_file() const {
// =================================================================== // ===================================================================
#ifndef _MSC_VER #if !defined(_MSC_VER) || _MSC_VER >= 1900
const int CodeGeneratorResponse_File::kNameFieldNumber; const int CodeGeneratorResponse_File::kNameFieldNumber;
const int CodeGeneratorResponse_File::kInsertionPointFieldNumber; const int CodeGeneratorResponse_File::kInsertionPointFieldNumber;
const int CodeGeneratorResponse_File::kContentFieldNumber; const int CodeGeneratorResponse_File::kContentFieldNumber;
#endif // !_MSC_VER #endif // !defined(_MSC_VER) || _MSC_VER >= 1900
CodeGeneratorResponse_File::CodeGeneratorResponse_File() CodeGeneratorResponse_File::CodeGeneratorResponse_File()
: ::google::protobuf::Message(), _internal_metadata_(NULL) { : ::google::protobuf::Message(), _internal_metadata_(NULL) {
...@@ -1021,10 +1021,10 @@ void CodeGeneratorResponse_File::InternalSwap(CodeGeneratorResponse_File* other) ...@@ -1021,10 +1021,10 @@ void CodeGeneratorResponse_File::InternalSwap(CodeGeneratorResponse_File* other)
// ------------------------------------------------------------------- // -------------------------------------------------------------------
#ifndef _MSC_VER #if !defined(_MSC_VER) || _MSC_VER >= 1900
const int CodeGeneratorResponse::kErrorFieldNumber; const int CodeGeneratorResponse::kErrorFieldNumber;
const int CodeGeneratorResponse::kFileFieldNumber; const int CodeGeneratorResponse::kFileFieldNumber;
#endif // !_MSC_VER #endif // !defined(_MSC_VER) || _MSC_VER >= 1900
CodeGeneratorResponse::CodeGeneratorResponse() CodeGeneratorResponse::CodeGeneratorResponse()
: ::google::protobuf::Message(), _internal_metadata_(NULL) { : ::google::protobuf::Message(), _internal_metadata_(NULL) {
......
...@@ -156,7 +156,7 @@ const char* FileDescriptor::SyntaxName(FileDescriptor::Syntax syntax) { ...@@ -156,7 +156,7 @@ const char* FileDescriptor::SyntaxName(FileDescriptor::Syntax syntax) {
static const char * const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty"; static const char * const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty";
#ifndef _MSC_VER // MSVC doesn't need these and won't even accept them. #if !defined(_MSC_VER) || _MSC_VER >= 1900
const int FieldDescriptor::kMaxNumber; const int FieldDescriptor::kMaxNumber;
const int FieldDescriptor::kFirstReservedNumber; const int FieldDescriptor::kFirstReservedNumber;
const int FieldDescriptor::kLastReservedNumber; const int FieldDescriptor::kLastReservedNumber;
......
This diff is collapsed.
...@@ -49,8 +49,10 @@ namespace google { ...@@ -49,8 +49,10 @@ namespace google {
namespace protobuf { namespace protobuf {
namespace internal { namespace internal {
#ifndef _MSC_VER // MSVC doesn't like definitions of inline constants, GCC
// requires them. #if !defined(_MSC_VER) || _MSC_VER >= 1900
// Old version of MSVC doesn't like definitions of inline constants, GCC
// requires them.
const int WireFormatLite::kMessageSetItemStartTag; const int WireFormatLite::kMessageSetItemStartTag;
const int WireFormatLite::kMessageSetItemEndTag; const int WireFormatLite::kMessageSetItemEndTag;
const int WireFormatLite::kMessageSetTypeIdTag; const int WireFormatLite::kMessageSetTypeIdTag;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment