From b115be707de3c91f8d49bd978f6a6da7ba0b7231 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Tue, 3 Jun 2008 22:06:04 +0000 Subject: [PATCH] Put back my temporary hack until Eli addresses this in a more complete fashion. llvm-svn: 51920 --- clang/lib/AST/Expr.cpp | 5 +++++ clang/test/Sema/darwin-align-cast.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 clang/test/Sema/darwin-align-cast.c diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 357d711978b3..a89fbd621a56 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -918,6 +918,11 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, if (!SubExpr->getType()->isArithmeticType() || !getType()->isIntegerType()) { if (Loc) *Loc = SubExpr->getLocStart(); + // GCC accepts pointers as an extension. + // FIXME: check getLangOptions().NoExtensions. At the moment, it doesn't + // appear possible to get langOptions() from the Expr. + if (SubExpr->getType()->isPointerType()) // && !NoExtensions + return true; return false; } diff --git a/clang/test/Sema/darwin-align-cast.c b/clang/test/Sema/darwin-align-cast.c new file mode 100644 index 000000000000..adf938f29bc1 --- /dev/null +++ b/clang/test/Sema/darwin-align-cast.c @@ -0,0 +1,23 @@ +// RUN: clang -fsyntax-only -verify %s +typedef long unsigned int __darwin_size_t; +typedef long __darwin_ssize_t; +typedef __darwin_size_t size_t; +typedef __darwin_ssize_t ssize_t; + +struct cmsghdr {}; + +#if 0 +This code below comes from the following system headers: +sys/socket.h:#define CMSG_SPACE(l) (__DARWIN_ALIGN(sizeof(struct +cmsghdr)) + __DARWIN_ALIGN(l)) + +i386/_param.h:#define __DARWIN_ALIGN(p) ((__darwin_size_t)((char *)(p) ++ __DARWIN_ALIGNBYTES) &~ __DARWIN_ALIGNBYTES) +#endif + +ssize_t sendFileDescriptor(int fd, void *data, size_t nbytes, int sendfd) { + union { + char control[(((__darwin_size_t)((char *)(sizeof(struct cmsghdr)) + (sizeof(__darwin_size_t) - 1)) &~ (sizeof(__darwin_size_t) - 1)) + ((__darwin_size_t)((char *)(sizeof(int)) + (sizeof(__darwin_size_t) - 1)) &~ (sizeof(__darwin_size_t) - 1)))]; + } control_un; +} + -- GitLab