summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-06-24 06:40:51 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-06-24 06:40:51 +0000
commit3e93571576d89e49dd1dc830d40243eb3a350790 (patch)
tree87b0e4550b2568efc68f9e16f9eb1294c0bc7333 /test
parent99ea974909aecf110b60b2d273f7cec97ebc0f11 (diff)
downloadclang-3e93571576d89e49dd1dc830d40243eb3a350790.tar.gz
clang-3e93571576d89e49dd1dc830d40243eb3a350790.tar.bz2
clang-3e93571576d89e49dd1dc830d40243eb3a350790.tar.xz
AST: Address of dllimport functions isn't constant
The address of dllimport functions can be accessed one of two ways: - Through the IAT which is symbolically referred to with a symbol starting with __imp_. - Via the wrapper-function which ends up calling through the __imp_ symbol. The problem with using the wrapper-function is that it's address will not compare as equal in all translation units. Specifically, it will compare unequally with the translation unit which defines the function. This fixes PR19955. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211570 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGenCXX/PR19955.cpp31
-rw-r--r--test/SemaCXX/PR19955.cpp7
2 files changed, 29 insertions, 9 deletions
diff --git a/test/CodeGenCXX/PR19955.cpp b/test/CodeGenCXX/PR19955.cpp
index 7d54ac3899..9e101550b4 100644
--- a/test/CodeGenCXX/PR19955.cpp
+++ b/test/CodeGenCXX/PR19955.cpp
@@ -1,10 +1,27 @@
// RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s --check-prefix X64
-extern int __declspec(dllimport) x;
-extern long long y;
-// CHECK-DAG: @"\01?y@@3_JA" = global i64 0
-long long y = (long long)&x;
+extern int __declspec(dllimport) var;
+extern void __declspec(dllimport) fun();
-// CHECK-LABEL: @"\01??__Ey@@YAXXZ"
-// CHECK-DAG: @"\01?y@@3_JA"
+extern int *varp;
+int *varp = &var;
+// CHECK-DAG: @"\01?varp@@3PAHA" = global i32* null
+// X64-DAG: @"\01?varp@@3PEAHEA" = global i32* null
+
+extern void (*funp)();
+void (*funp)() = &fun;
+// CHECK-DAG: @"\01?funp@@3P6AXXZA" = global void ()* null
+// X64-DAG: @"\01?funp@@3P6AXXZEA" = global void ()* null
+
+// CHECK-LABEL: @"\01??__Evarp@@YAXXZ"
+// CHECK-DAG: store i32* @"\01?var@@3HA", i32** @"\01?varp@@3PAHA"
+
+// X64-LABEL: @"\01??__Evarp@@YAXXZ"
+// X64-DAG: store i32* @"\01?var@@3HA", i32** @"\01?varp@@3PEAHEA"
+
+// CHECK-LABEL: @"\01??__Efunp@@YAXXZ"()
+// CHECK-DAG: store void ()* @"\01?fun@@YAXXZ", void ()** @"\01?funp@@3P6AXXZA"
+
+// X64-LABEL: @"\01??__Efunp@@YAXXZ"()
+// X64-DAG: store void ()* @"\01?fun@@YAXXZ", void ()** @"\01?funp@@3P6AXXZEA"
diff --git a/test/SemaCXX/PR19955.cpp b/test/SemaCXX/PR19955.cpp
index 81fa70d7f5..e0d4618f2c 100644
--- a/test/SemaCXX/PR19955.cpp
+++ b/test/SemaCXX/PR19955.cpp
@@ -1,4 +1,7 @@
// RUN: %clang_cc1 -triple i686-win32 -verify -std=c++11 %s
-extern int __attribute__((dllimport)) y;
-constexpr int *x = &y; // expected-error {{must be initialized by a constant expression}}
+extern int __attribute__((dllimport)) var;
+constexpr int *varp = &var; // expected-error {{must be initialized by a constant expression}}
+
+extern __attribute__((dllimport)) void fun();
+constexpr void (*funp)(void) = &fun; // expected-error {{must be initialized by a constant expression}}