This time with the patch.
>From 30aa5f60df109cd80b45429818c6ba0fa548b3b8 Mon Sep 17 00:00:00 2001
From: Nico Rieck <[email protected]>
Date: Mon, 20 Jan 2014 19:28:12 +0100
Subject: [PATCH] Treat dllimport globals without explicit storage class as extern

dllimport implies a definition which means the 'extern' keyword is optional
when declaring imported variables.
---
 lib/Sema/SemaDecl.cpp      | 7 +++++++
 test/Sema/dllimport.c      | 6 ++++++
 test/SemaCXX/dllimport.cpp | 6 ++++++
 3 files changed, 19 insertions(+)

diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 601c161..94e377b 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -5457,6 +5457,13 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
     }
   }
 
+  // dllimport without explicit storage class is treated as extern.
+  if (const DLLImportAttr *DA = NewVD->getAttr<DLLImportAttr>()) {
+    if (!DA->isInherited() && NewVD->getStorageClass() == SC_None &&
+        !NewVD->isStaticDataMember())
+      NewVD->setStorageClass(SC_Extern);
+  }
+
   ProcessPragmaWeak(S, NewVD);
 
   // If this is the first declaration of an extern C variable, update
diff --git a/test/Sema/dllimport.c b/test/Sema/dllimport.c
index 615f8f7..db26074 100644
--- a/test/Sema/dllimport.c
+++ b/test/Sema/dllimport.c
@@ -32,10 +32,16 @@ int __declspec(dllimport) GlobalInit2 = 1; // expected-error{{definition of dlli
 __declspec(dllimport) extern int ExternGlobalDeclInit;
 int ExternGlobalDeclInit = 1; // expected-error{{definition of dllimport data}}
 
+__declspec(dllimport) int GlobalDeclInit;
+int GlobalDeclInit = 1; // expected-error{{definition of dllimport data}}
+
 // Redeclarations
 __declspec(dllimport) extern int GlobalRedecl1;
 __declspec(dllimport) extern int GlobalRedecl1;
 
+__declspec(dllimport) int GlobalRedecl2;
+__declspec(dllimport) int GlobalRedecl2;
+
 // Import in local scope.
 void functionScope() {
   __declspec(dllimport)        int LocalVarDecl;
diff --git a/test/SemaCXX/dllimport.cpp b/test/SemaCXX/dllimport.cpp
index 4a3ee20..de32563 100644
--- a/test/SemaCXX/dllimport.cpp
+++ b/test/SemaCXX/dllimport.cpp
@@ -44,10 +44,16 @@ int __declspec(dllimport) GlobalInit2 = 1; // expected-error{{definition of dlli
 __declspec(dllimport) extern int ExternGlobalDeclInit;
 int ExternGlobalDeclInit = 1; // expected-error{{definition of dllimport data}}
 
+__declspec(dllimport) int GlobalDeclInit;
+int GlobalDeclInit = 1; // expected-error{{definition of dllimport data}}
+
 // Redeclarations
 __declspec(dllimport) extern int GlobalRedecl1;
 __declspec(dllimport) extern int GlobalRedecl1;
 
+__declspec(dllimport) int GlobalRedecl2;
+__declspec(dllimport) int GlobalRedecl2;
+
 // Import in local scope.
 void functionScope() {
   __declspec(dllimport)        int LocalVarDecl;
-- 
1.9.0.msysgit.0

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to