95 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -verify %s2// RUN: not %clang_cc1 -std=c++20 -fsyntax-only -fno-diagnostics-show-line-numbers -fcaret-diagnostics-max-lines=1 %s 2>&1 | FileCheck %s -strict-whitespace3 4namespace GH46386 {5 extern "C" { // expected-note {{extern "C" language linkage specification begins here}}6 7 // CHECK: error: templates must have C++ linkage8 // CHECK-NEXT: {{^}} void f(auto) {}9 // CHECK-NEXT: {{^}} ^~~~~{{$}}10 void f(auto) {} // expected-error {{templates must have C++ linkage}}11 12 void f(void) { // expected-note {{candidate function not viable: requires 0 arguments, but 1 was provided}}13 f(1); // expected-error {{no matching function for call to 'f'}}14 }15}16}17 18// Templates and partial and explicit specializations can't have C linkage.19namespace extern_c_templates {20 21template<typename T> struct A {22 static int a;23 struct b;24 void c();25 enum class d;26 27 template<typename U> static int e;28 template<typename U> struct f;29 template<typename U> void g();30};31 32template<typename T> int B;33template<typename T> void C();34 35extern "C" { // expected-note 1+{{begins here}}36 // templates37 template<typename T> struct A; // expected-error {{templates must have C++ linkage}}38 template<typename T> int B; // expected-error {{templates must have C++ linkage}}39 template<typename T> void C(); // expected-error {{templates must have C++ linkage}}40 41 // non-template members of a template42 // FIXME: Should these really be valid?43 template<typename T> int A<T>::a;44 template<typename T> struct A<T>::b {};45 template<typename T> void A<T>::c() {}46 template<typename T> enum class A<T>::d {};47 48 // templates49 template<typename T> template<typename U> int A<T>::e; // expected-error {{templates must have C++ linkage}}50 template<typename T> template<typename U> struct A<T>::f {}; // expected-error {{templates must have C++ linkage}}51 template<typename T> template<typename U> void A<T>::g() {} // expected-error {{templates must have C++ linkage}}52 53 // partial specializations54 template<typename T> struct A<int*>; // expected-error {{templates must have C++ linkage}}55 template<typename T> int B<int*>; // expected-error {{templates must have C++ linkage}}56 template<typename T> template<typename U> int A<T>::e<U*>; // expected-error {{templates must have C++ linkage}}57 template<typename T> template<typename U> struct A<T>::f<U*> {}; // expected-error {{templates must have C++ linkage}}58 59 // explicit specializations of templates60 template<> struct A<char> {}; // expected-error {{templates must have C++ linkage}}61 template<> int B<char>; // expected-error {{templates must have C++ linkage}}62 template<> void C<char>() {} // expected-error {{templates must have C++ linkage}}63 64 // explicit specializations of members of a template65 template<> int A<int>::a; // expected-error {{templates must have C++ linkage}}66 template<> struct A<int>::b {}; // expected-error {{templates must have C++ linkage}}67 template<> void A<int>::c() {} // expected-error {{templates must have C++ linkage}}68 template<> enum class A<int>::d {}; // expected-error {{templates must have C++ linkage}}69 70 // explicit specializations of member templates71 template<> template<typename U> int A<int>::e; // expected-error {{templates must have C++ linkage}}72 template<> template<typename U> struct A<int>::f {}; // expected-error {{templates must have C++ linkage}}73 template<> template<typename U> void A<int>::g() {} // expected-error {{templates must have C++ linkage}}74}75 76// Provide valid definitions for the explicit instantiations below.77// FIXME: Our recovery from the invalid definitions above isn't very good.78template<typename T> template<typename U> int A<T>::e;79template<typename T> template<typename U> struct A<T>::f {};80template<typename T> template<typename U> void A<T>::g() {}81 82extern "C" {83 // explicit instantiations84 // FIXME: Should these really be valid?85 template struct A<double>;86 template int A<float>::a;87 template struct A<float>::b;88 template void A<float>::c();89 template int A<float>::e<float>;90 template struct A<float>::f<float>;91 template void A<float>::g<float>();92}93 94}95