[PATCH] D41179: [Sema] Diagnose template specializations with C linkage

Serge Pavlov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Dec 17 20:58:16 PST 2017

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.


More information about the cfe-commits mailing list