From: Chris Lattner Date: Sun, 5 Apr 2009 00:52:59 +0000 (+0000) Subject: GCC compatibility: gcc allows applying va_args to const X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f502691c86299ed23b7e121e27610ba5bb44a1ee;p=clang GCC compatibility: gcc allows applying va_args to const va_lists for some reason. This fixes rdar://6726818 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68434 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 55eaaa4bc8..a43c2c370e 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4724,7 +4724,10 @@ Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc, Expr *E = static_cast(expr.get()); UsualUnaryConversions(E); - if (CheckAssignmentConstraints(VaListType, E->getType()) != Compatible) + AssignConvertType ConvResult = + CheckAssignmentConstraints(VaListType, E->getType()); + if (ConvResult != Compatible && + ConvResult != CompatiblePointerDiscardsQualifiers) return ExprError(Diag(E->getLocStart(), diag::err_first_argument_to_va_arg_not_of_type_va_list) << E->getType() << E->getSourceRange()); diff --git a/test/Sema/varargs.c b/test/Sema/varargs.c index 434e4ce291..7255f9fc06 100644 --- a/test/Sema/varargs.c +++ b/test/Sema/varargs.c @@ -60,3 +60,10 @@ void f7(int a, ...) { int *x = &__builtin_va_arg(ap, int); // expected-error {{address expression must be an lvalue or a function designator}} __builtin_va_end(ap); } + +// rdar://6726818 +void f8() { + const __builtin_va_list args2; + (void)__builtin_va_arg(args2, int); +} +