diff options
| author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-01-30 21:21:08 +0000 |
|---|---|---|
| committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-01-30 21:21:08 +0000 |
| commit | f5291d2871bc4ad47655803e6c9112796ff55d1d (patch) | |
| tree | 4fa217df576af08a7e1e395fd2d00abd5c5db83c | |
| parent | 8f39876ac305a06bc4934829ce64fad28f2dd905 (diff) | |
| download | bcm5719-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.cpp | 8 | ||||
| -rw-r--r-- | clang/test/CodeGen/opaque-pointer.c | 13 |
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; +} |

