]> granicus.if.org Git - clang/commitdiff
A pointer to an opaque type is an "opaque type definition".
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 30 Jan 2008 21:21:08 +0000 (21:21 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 30 Jan 2008 21:21:08 +0000 (21:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46575 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenTypes.cpp
test/CodeGen/opaque-pointer.c [new file with mode: 0644]

index 4cced51e2570eac824db9c2a6f8299ca2b5e9368..7c6abc1bec56811cc1b1fdd58666f94b0b703b95 100644 (file)
@@ -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/test/CodeGen/opaque-pointer.c b/test/CodeGen/opaque-pointer.c
new file mode 100644 (file)
index 0000000..33706aa
--- /dev/null
@@ -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;
+}