summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2015-09-04 19:59:39 +0000
committerHans Wennborg <hans@hanshq.net>2015-09-04 19:59:39 +0000
commit5427a695453c85a45a0d92c892e3f3c25885fe18 (patch)
treebd529451f4b0943886d25fa11974d2cf16488647 /clang/test
parent0fccef6ac2fc87f4dd29a1d098723cd2869a09ab (diff)
downloadbcm5719-llvm-5427a695453c85a45a0d92c892e3f3c25885fe18.tar.gz
bcm5719-llvm-5427a695453c85a45a0d92c892e3f3c25885fe18.zip
Don't allow dllexport/import on static local variables
They might technically have external linkage, but it still doesn't make sense for the user to try and export such variables. This matches MSVC's and MinGW's behaviour. llvm-svn: 246864
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Sema/dllexport.c5
-rw-r--r--clang/test/Sema/dllimport.c5
-rw-r--r--clang/test/SemaCXX/dllexport.cpp9
-rw-r--r--clang/test/SemaCXX/dllimport.cpp8
4 files changed, 13 insertions, 14 deletions
diff --git a/clang/test/Sema/dllexport.c b/clang/test/Sema/dllexport.c
index 69aad2eb54c..56c9e74225f 100644
--- a/clang/test/Sema/dllexport.c
+++ b/clang/test/Sema/dllexport.c
@@ -109,6 +109,11 @@ __declspec(dllexport) void redecl6(); // expected-warning{{redeclaration of 'red
// External linkage is required.
__declspec(dllexport) static int staticFunc(); // expected-error{{'staticFunc' must have external linkage when declared 'dllexport'}}
+// Static locals don't count as having external linkage.
+void staticLocalFunc() {
+ __declspec(dllexport) static int staticLocal; // expected-error{{'staticLocal' must have external linkage when declared 'dllexport'}}
+}
+
//===----------------------------------------------------------------------===//
diff --git a/clang/test/Sema/dllimport.c b/clang/test/Sema/dllimport.c
index d81aecd604c..f863499cf84 100644
--- a/clang/test/Sema/dllimport.c
+++ b/clang/test/Sema/dllimport.c
@@ -168,3 +168,8 @@ __declspec(dllimport) inline void redecl7() {}
// External linkage is required.
__declspec(dllimport) static int staticFunc(); // expected-error{{'staticFunc' must have external linkage when declared 'dllimport'}}
+
+// Static locals don't count as having external linkage.
+void staticLocalFunc() {
+ __declspec(dllimport) static int staticLocal; // expected-error{{'staticLocal' must have external linkage when declared 'dllimport'}}
+}
diff --git a/clang/test/SemaCXX/dllexport.cpp b/clang/test/SemaCXX/dllexport.cpp
index c3f26aa3155..f7076fb8e86 100644
--- a/clang/test/SemaCXX/dllexport.cpp
+++ b/clang/test/SemaCXX/dllexport.cpp
@@ -71,14 +71,9 @@ __declspec(dllexport) auto ExternalAutoTypeGlobal = External();
// Thread local variables are invalid.
__declspec(dllexport) __thread int ThreadLocalGlobal; // expected-error{{'ThreadLocalGlobal' cannot be thread local when declared 'dllexport'}}
-inline void InlineWithThreadLocal() {
- static __declspec(dllexport) __thread int ThreadLocalGlobal; // expected-error{{'ThreadLocalGlobal' cannot be thread local when declared 'dllexport'}}
-}
-
-// But if they're in a dllexport function, it's ok, because they will never get imported.
+// But a static local TLS var in an export function is OK.
inline void __declspec(dllexport) ExportedInlineWithThreadLocal() {
- static __declspec(dllexport) __thread int OK1; // no-error
- static __thread int OK2; // no-error
+ static __thread int OK; // no-error
}
// Export in local scope.
diff --git a/clang/test/SemaCXX/dllimport.cpp b/clang/test/SemaCXX/dllimport.cpp
index f17c2e22414..91ed6b42606 100644
--- a/clang/test/SemaCXX/dllimport.cpp
+++ b/clang/test/SemaCXX/dllimport.cpp
@@ -93,16 +93,10 @@ __declspec(dllimport) auto InternalAutoTypeGlobal = Internal(); // expected-erro
// Thread local variables are invalid.
__declspec(dllimport) __thread int ThreadLocalGlobal; // expected-error{{'ThreadLocalGlobal' cannot be thread local when declared 'dllimport'}}
-inline void InlineWithThreadLocal() {
- static __declspec(dllimport) __thread int ThreadLocalGlobal; // expected-error{{'ThreadLocalGlobal' cannot be thread local when declared 'dllimport'}}
-}
-
-// But if they're in a dllimported function, it's OK because we will not inline the function.
// This doesn't work on MinGW, because there, dllimport on the inline function is ignored.
#ifndef GNU
inline void __declspec(dllimport) ImportedInlineWithThreadLocal() {
- static __declspec(dllimport) __thread int OK1; // no-error
- static __thread int OK2; // no-error
+ static __thread int OK; // no-error
}
#endif
OpenPOWER on IntegriCloud