From adadd8db2aba32f689e7057d8b7ce004be30685b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 12 Feb 2009 09:21:08 +0000 Subject: [PATCH] Fix va_arg bug noticed by Eli, __builtin_va_arg is not an l-value designating an object. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64371 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Expr.cpp | 2 +- test/Sema/varargs.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 95a6a349f3..7b06a3c1ce 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -565,7 +565,7 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { case PredefinedExprClass: return LV_Valid; case VAArgExprClass: - return LV_Valid; + return LV_NotObjectType; case CXXDefaultArgExprClass: return cast(this)->getExpr()->isLvalue(Ctx); case CXXConditionDeclExprClass: diff --git a/test/Sema/varargs.c b/test/Sema/varargs.c index ae21c208eb..b340177f9c 100644 --- a/test/Sema/varargs.c +++ b/test/Sema/varargs.c @@ -52,3 +52,11 @@ foo(__builtin_va_list authors, ...) { __builtin_va_end (authors); } +void f7(int a, ...) { + __builtin_va_list ap; + __builtin_va_start(ap, a); + // FIXME: This error message is sub-par. + __builtin_va_arg(ap, int) = 1; // expected-error {{non-object type 'int' is not assignable}} + int *x = &__builtin_va_arg(ap, int); // expected-error {{address expression must be an lvalue or a function designator}} + __builtin_va_end(ap); +} -- 2.40.0