THRIFT-3413 Thrift code generation bug in Go when extending service
Client: Go
Patch: Jens Geyer
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc
index 5e743cb..856fb53 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -250,7 +250,7 @@
   std::string go_imports_begin(bool ttypes);
   std::string go_imports_end();
   std::string render_includes(bool ttypes);
-  std::string render_included_programs();
+  std::string render_included_programs(string& unused_protection);
   std::string render_import_protection();
   std::string render_fastbinary_includes();
   std::string declare_argument(t_field* tfield);
@@ -767,10 +767,12 @@
 }
 
 
-string t_go_generator::render_included_programs() {
+string t_go_generator::render_included_programs(string& unused_protection) {
   const vector<t_program*>& includes = program_->get_includes();
   string result = "";
 
+  unused_protection = "";
+
   for (size_t i = 0; i < includes.size(); ++i) {
     string go_module = get_real_go_module(includes[i]);
     size_t found = 0;
@@ -783,6 +785,7 @@
     }
 
     result += "\t\"" + gen_package_prefix_ + go_module + "\"\n";
+    unused_protection += "var _ = " + go_module.substr(found) + ".GoUnusedProtection__\n";
   }
 
   return result;
@@ -2120,6 +2123,8 @@
     service_module = gen_package_prefix_ + service_module;
   }
 
+  string unused_protection;
+
   f_remote << go_autogen_comment();
   f_remote << indent() << "package main" << endl << endl;
   f_remote << indent() << "import (" << endl;
@@ -2132,10 +2137,12 @@
   f_remote << indent() << "        \"strconv\"" << endl;
   f_remote << indent() << "        \"strings\"" << endl;
   f_remote << indent() << "        \"" + gen_thrift_import_ + "\"" << endl;
-  f_remote << indent() << render_included_programs();
+  f_remote << indent() << render_included_programs(unused_protection);
   f_remote << indent() << "        \"" << service_module << "\"" << endl;
   f_remote << indent() << ")" << endl;
   f_remote << indent() << endl;
+  f_remote << indent() << unused_protection; // filled in render_included_programs()
+  f_remote << indent() << endl;
   f_remote << indent() << "func Usage() {" << endl;
   f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" "
                           "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:\")"