summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLauro Ramos Venancio <lauro.venancio@gmail.com>2008-01-30 21:21:08 +0000
committerLauro Ramos Venancio <lauro.venancio@gmail.com>2008-01-30 21:21:08 +0000
commitf5291d2871bc4ad47655803e6c9112796ff55d1d (patch)
tree4fa217df576af08a7e1e395fd2d00abd5c5db83c
parent8f39876ac305a06bc4934829ce64fad28f2dd905 (diff)
downloadbcm5719-llvm-f5291d2871bc4ad47655803e6c9112796ff55d1d.tar.gz
bcm5719-llvm-f5291d2871bc4ad47655803e6c9112796ff55d1d.zip
A pointer to an opaque type is an "opaque type definition".
llvm-svn: 46575
-rw-r--r--clang/CodeGen/CodeGenTypes.cpp8
-rw-r--r--clang/test/CodeGen/opaque-pointer.c13
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/CodeGen/CodeGenTypes.cpp b/clang/CodeGen/CodeGenTypes.cpp
index 4cced51e257..7c6abc1bec5 100644
--- a/clang/CodeGen/CodeGenTypes.cpp
+++ b/clang/CodeGen/CodeGenTypes.cpp
@@ -94,8 +94,12 @@ CodeGenTypes::~CodeGenTypes() {
/// isOpaqueTypeDefinition - Return true if LT is a llvm::OpaqueType
/// and T is tag definition. This helper routine does not check
/// relationship between T and LT.
-static bool isOpaqueTypeDefinition(QualType T, llvm::Type *LT) {
-
+static bool isOpaqueTypeDefinition(QualType T, const llvm::Type *LT) {
+ if (T->isPointerType()) {
+ return
+ isOpaqueTypeDefinition(cast<PointerType>(*T).getPointeeType(),
+ cast<llvm::PointerType>(LT)->getElementType());
+ }
if (!isa<llvm::OpaqueType>(LT))
return false;
diff --git a/clang/test/CodeGen/opaque-pointer.c b/clang/test/CodeGen/opaque-pointer.c
new file mode 100644
index 00000000000..33706aa9d88
--- /dev/null
+++ b/clang/test/CodeGen/opaque-pointer.c
@@ -0,0 +1,13 @@
+// RUN: clang %s -emit-llvm
+struct test;
+
+typedef void (*my_func) (struct test *);
+my_func handler;
+
+struct test {
+ char a;
+};
+
+char f(struct test *t) {
+ return t->a;
+}
OpenPOWER on IntegriCloud