Index: src/SymTab/Demangle.cc
===================================================================
--- src/SymTab/Demangle.cc	(revision 4084928eae5498efed55486197c04b51fe7be79b)
+++ src/SymTab/Demangle.cc	(revision f47d0adc7487f4e181df112633678188f0502e99)
@@ -509,4 +509,12 @@
 				return true;
 			}
+
+			std::string demangle(const std::string & mangleName) {
+				SymTab::Mangler::StringView view(mangleName);
+				std::string name;
+				Type * type = nullptr;
+				if (! view.parse(name, type)) return mangleName;
+				return genDemangleType(type, name);
+			}
 		} // namespace
 	} // namespace Mangler
@@ -514,11 +522,8 @@
 
 extern "C" {
-	std::string cforall_demangle(const std::string & mangleName) {
-		SymTab::Mangler::StringView view(mangleName);
-		std::string name;
-		Type * type = nullptr;
-		if (! view.parse(name, type)) return mangleName;
-		return genDemangleType(type, name);
-	} // extern "C"
+	char * cforall_demangle(const char * mangleName) {
+		const std::string & demangleName = SymTab::Mangler::demangle(mangleName);
+		return strdup(demangleName.c_str());
+	}
 }
 
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision 4084928eae5498efed55486197c04b51fe7be79b)
+++ src/SymTab/Mangler.h	(revision f47d0adc7487f4e181df112633678188f0502e99)
@@ -69,5 +69,5 @@
 
 extern "C" {
-	std::string cforall_demangle(const std::string &);
+	char * cforall_demangle(const char *);
 }
 
Index: src/SymTab/demangler.cc
===================================================================
--- src/SymTab/demangler.cc	(revision 4084928eae5498efed55486197c04b51fe7be79b)
+++ src/SymTab/demangler.cc	(revision f47d0adc7487f4e181df112633678188f0502e99)
@@ -5,14 +5,16 @@
 
 void f(const std::string & mangleName) {
-  cout << mangleName << " => " << std::flush << cforall_demangle(mangleName) << endl;
+	char * demangleName = cforall_demangle(mangleName.c_str());
+	cout << mangleName << " => " << std::flush << demangleName << endl;
+	free(demangleName);
 }
 
 int main() {
-  ifstream in("in-demangle.txt");
-  std::string line;
-  while (getline(in, line)) {
-    if (line.empty()) { cout << "=================================" << endl; continue; }
-    else if (line[0] == '#') continue;
-    f(line);
-  }
+	ifstream in("in-demangle.txt");
+	std::string line;
+	while (getline(in, line)) {
+		if (line.empty()) { cout << "=================================" << endl; continue; }
+		else if (line[0] == '#') continue;
+		f(line);
+	}
 }
