From 8f426fa9fca022201fc0944d6c1cb2cf9918db7d Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 20 Apr 2009 03:21:44 +0000 Subject: [PATCH] PR3248: Make sure the evaluate the operand of a sizeof when it has a VLA type. Adapted from patch by Tim Northover. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69566 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGExprScalar.cpp | 4 ++++ test/CodeGen/variable-array.c | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 test/CodeGen/variable-array.c diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 98c41e24b6..0c6e6c6854 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -725,6 +725,10 @@ ScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { if (E->isArgumentType()) { // sizeof(type) - make sure to emit the VLA size. CGF.EmitVLASize(TypeToSize); + } else { + // C99 6.5.3.4p2: If the argument is an expression of type + // VLA, it is evaluated. + CGF.EmitAnyExpr(E->getArgumentExpr()); } return CGF.GetVLASize(VAT); diff --git a/test/CodeGen/variable-array.c b/test/CodeGen/variable-array.c new file mode 100644 index 0000000000..280539fa89 --- /dev/null +++ b/test/CodeGen/variable-array.c @@ -0,0 +1,7 @@ +// RUN: clang-cc -emit-llvm < %s | grep puts + +int a(int x) +{ + int (*y)[x]; + return sizeof(*(puts("asdf"),y)); +} -- 2.40.0