diff --git a/Source/cmCreateTestSourceList.cxx b/Source/cmCreateTestSourceList.cxx
index 3001ae09a9d508f12c8d72b8df75b46280b86e60..a2fac738c30a55b6d4d84d14325ca32ffa447ed4 100644
--- a/Source/cmCreateTestSourceList.cxx
+++ b/Source/cmCreateTestSourceList.cxx
@@ -90,10 +90,15 @@ bool cmCreateTestSourceList(std::vector<std::string> const& args,
     std::replace(func_name.begin(), func_name.end(), ' ', '_');
     std::replace(func_name.begin(), func_name.end(), '/', '_');
     std::replace(func_name.begin(), func_name.end(), ':', '_');
+    bool already_declared =
+      std::find(tests_func_name.begin(), tests_func_name.end(), func_name) !=
+      tests_func_name.end();
     tests_func_name.push_back(func_name);
-    forwardDeclareCode += "int ";
-    forwardDeclareCode += func_name;
-    forwardDeclareCode += "(int, char*[]);\n";
+    if (!already_declared) {
+      forwardDeclareCode += "int ";
+      forwardDeclareCode += func_name;
+      forwardDeclareCode += "(int, char*[]);\n";
+    }
   }
 
   std::string functionMapCode;