diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-02-12 09:21:08 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-02-12 09:21:08 +0000 |
commit | 6d0402d4687b636724e685c8f8269971c0def34c (patch) | |
tree | c244ec1f90957096cbc66bbe0b8e90bdcde55df3 /clang | |
parent | 753cc07d1390c7b9382e7f4dcb6944b2698e5bf9 (diff) | |
download | bcm5719-llvm-6d0402d4687b636724e685c8f8269971c0def34c.tar.gz bcm5719-llvm-6d0402d4687b636724e685c8f8269971c0def34c.zip |
Fix va_arg bug noticed by Eli, __builtin_va_arg is not an l-value
designating an object.
llvm-svn: 64371
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 2 | ||||
-rw-r--r-- | clang/test/Sema/varargs.c | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 95a6a349f31..7b06a3c1ce6 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/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<CXXDefaultArgExpr>(this)->getExpr()->isLvalue(Ctx); case CXXConditionDeclExprClass: diff --git a/clang/test/Sema/varargs.c b/clang/test/Sema/varargs.c index ae21c208eb8..b340177f9c5 100644 --- a/clang/test/Sema/varargs.c +++ b/clang/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); +} |