summaryrefslogtreecommitdiffstats
path: root/test/SemaCXX/linkage-spec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/linkage-spec.cpp')
-rw-r--r--test/SemaCXX/linkage-spec.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/test/SemaCXX/linkage-spec.cpp b/test/SemaCXX/linkage-spec.cpp
index 504df0d..1598d0e 100644
--- a/test/SemaCXX/linkage-spec.cpp
+++ b/test/SemaCXX/linkage-spec.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify -Wretained-language-linkage -DW_RETAINED_LANGUAGE_LINKAGE %s
extern "C" {
extern "C" void f(int);
}
@@ -41,7 +42,7 @@ namespace pr5430 {
using namespace pr5430;
extern "C" void pr5430::func(void) { }
-// PR5404
+// PR5405
int f2(char *)
{
return 0;
@@ -55,6 +56,18 @@ extern "C"
}
}
+namespace PR5405 {
+ int f2b(char *) {
+ return 0;
+ }
+
+ extern "C" {
+ int f2b(int) {
+ return f2b((char *)0); // ok
+ }
+ }
+}
+
// PR6991
extern "C" typedef int (*PutcFunc_t)(int);
@@ -114,3 +127,49 @@ namespace pr14958 {
}
int js::ObjectClass;
}
+
+extern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}}
+extern void PR16167_0; // expected-error {{variable has incomplete type 'void'}}
+
+// PR7927
+enum T_7927 {
+ E_7927
+};
+
+extern "C" void f_pr7927(int);
+
+namespace {
+ extern "C" void f_pr7927(int);
+
+ void foo_pr7927() {
+ f_pr7927(E_7927);
+ f_pr7927(0);
+ ::f_pr7927(E_7927);
+ ::f_pr7927(0);
+ }
+}
+
+void bar_pr7927() {
+ f_pr7927(E_7927);
+ f_pr7927(0);
+ ::f_pr7927(E_7927);
+ ::f_pr7927(0);
+}
+
+namespace PR17337 {
+ extern "C++" {
+ class Foo;
+ extern "C" int bar3(Foo *y);
+ class Foo {
+ int x;
+ friend int bar3(Foo *y);
+#ifdef W_RETAINED_LANGUAGE_LINKAGE
+// expected-note@-5 {{previous declaration is here}}
+// expected-warning@-3 {{retaining previous language linkage}}
+#endif
+ };
+ extern "C" int bar3(Foo *y) {
+ return y->x;
+ }
+ }
+}
OpenPOWER on IntegriCloud