diff options
-rw-r--r-- | lib/AST/Expr.cpp | 2 | ||||
-rw-r--r-- | test/Sema/varargs.c | 8 |
2 files changed, 9 insertions, 1 deletions
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<CXXDefaultArgExpr>(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); +} |