From: Lauro Ramos Venancio Date: Wed, 30 Jan 2008 21:21:08 +0000 (+0000) Subject: A pointer to an opaque type is an "opaque type definition". X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8df106e16197bf4bc055a9a9d73f4b78351c0c3e;p=clang A pointer to an opaque type is an "opaque type definition". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46575 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index 4cced51e25..7c6abc1bec 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/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(*T).getPointeeType(), + cast(LT)->getElementType()); + } if (!isa(LT)) return false; diff --git a/test/CodeGen/opaque-pointer.c b/test/CodeGen/opaque-pointer.c new file mode 100644 index 0000000000..33706aa9d8 --- /dev/null +++ b/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; +}