sepavloff added a comment. Is it correct to emit error in this case?
According to the Standard 10.5p1 "All function types, function names with external linkage, and variable names with external linkage have a language linkage". So templates do not have a language linkage. The next paragraph, which introduces inkage-specification, states: "The string-literal indicates the required language linkage". So the construct `extern "C"` specifies just language linkage, which is not pertinent to templates. In 10.5p4 there is an example of a class defined in extern "C" construct: extern "C" { class X { void mf(); // the name of the function mf and the member function’s type have // C++ language linkage void mf2(void(*)()); // the name of the function mf2 has C++ language linkage; // the parameter has type “pointer to C function” }; } Classes do not have language linkage according to 10.5p1, just as templates, so this code is valid. It looks like defining templates inside extern "C" blocks is OK. https://reviews.llvm.org/D41179 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits