THRIFT-2645 generated Go server code always sets Success retval
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 f9bd3d3..61eaf1b 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -2498,8 +2498,8 @@
                    indent() << "result := " << resultname << "{}" << endl;
     }
     bool need_reference = type_need_reference(tfunction->get_returntype());
-    if (need_reference && !tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-		f_service_ << "var retval " <<type_to_go_type(tfunction->get_returntype()) <<endl;
+    if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
+        f_service_ << "var retval " <<type_to_go_type(tfunction->get_returntype()) <<endl;
     }
 
     f_service_ <<
@@ -2508,11 +2508,7 @@
 
     if (!tfunction->is_oneway()) {
         if (!tfunction->get_returntype()->is_void()) {
-        	if( need_reference) {
-                f_service_ << "retval, ";
-        	} else {
-                f_service_ << "result.Success, ";
-        	}
+            f_service_ << "retval, ";
         }
     }
 
@@ -2572,11 +2568,23 @@
     }
 
     f_service_ <<
-               indent() << "}" << endl;
+               indent() << "}";  // closes err2 != nil
 
     if (!tfunction->is_oneway()) {
-        if (need_reference && !tfunction->get_returntype()->is_void()) {
-    		f_service_ << "result.Success = &retval" << endl;
+        if (!tfunction->get_returntype()->is_void()) {
+            f_service_ << " else {" << endl; // make sure we set Success retval only on success
+            indent_up();
+            f_service_ << 
+                indent() << "result.Success = ";
+            if(need_reference) {
+                f_service_ << "&";
+            }
+            f_service_ << 
+                "retval" << endl;
+            indent_down();
+            f_service_ << "}"  << endl;
+        } else {
+            f_service_ << endl;
         }
         f_service_ <<
                    indent() << "if err2 = oprot.WriteMessageBegin(\"" << escape_string(tfunction->get_name()) << 
@@ -2597,7 +2605,7 @@
                    indent() << "}" << endl <<
                    indent() << "return true, err" << endl;
     } else {
-        f_service_ <<
+        f_service_ << endl <<
                  indent() << "return true, nil" << endl;
     }
     indent_down();