summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-05 15:49:53 +0000
committerChris Lattner <sabre@nondot.org>2009-04-05 15:49:53 +0000
commit0d20b8a6d8af041edeb27cc4c68392454297e308 (patch)
tree7546343a73e10d8696f3120266bb2b627ba6be1a
parentf076339c679a889f751873a9cf8e5ad4a8686a03 (diff)
downloadclang-0d20b8a6d8af041edeb27cc4c68392454297e308.tar.gz
in va_arg diagnostics, print out the unpromoted type. This makes the
diagnostic use the va_list typedef more often, see the difference in the changed testcase. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68441 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExpr.cpp9
-rw-r--r--test/Sema/varargs-x86-64.c2
2 files changed, 6 insertions, 5 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index a4335eaf62..99afd32f10 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -4710,7 +4710,9 @@ Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc,
ExprArg expr, TypeTy *type,
SourceLocation RPLoc) {
QualType T = QualType::getFromOpaquePtr(type);
-
+ Expr *E = static_cast<Expr*>(expr.get());
+ Expr *OrigExpr = E;
+
InitBuiltinVaListType();
// Get the va_list type
@@ -4721,7 +4723,6 @@ Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc,
if (VaListType->isArrayType())
VaListType = Context.getArrayDecayedType(VaListType);
// Make sure the input expression also decays appropriately.
- Expr *E = static_cast<Expr*>(expr.get());
UsualUnaryConversions(E);
AssignConvertType ConvResult =
@@ -4730,13 +4731,13 @@ Sema::OwningExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc,
case Compatible: break; // Everything good.
case CompatiblePointerDiscardsQualifiers:
Diag(E->getLocStart(), diag::warn_va_arg_with_qualified_va_list)
- << E->getType() << E->getSourceRange();
+ << OrigExpr->getType() << E->getSourceRange();
break;
default:
return ExprError(Diag(E->getLocStart(),
diag::err_first_argument_to_va_arg_not_of_type_va_list)
- << E->getType() << E->getSourceRange());
+ << OrigExpr->getType() << E->getSourceRange());
}
// FIXME: Check that type is complete/non-abstract
diff --git a/test/Sema/varargs-x86-64.c b/test/Sema/varargs-x86-64.c
index 7953eada49..5afcda2471 100644
--- a/test/Sema/varargs-x86-64.c
+++ b/test/Sema/varargs-x86-64.c
@@ -3,6 +3,6 @@
// rdar://6726818
void f1() {
const __builtin_va_list args2;
- (void)__builtin_va_arg(args2, int); // expected-warning {{va_arg applied to va_list type 'struct __va_list_tag const *' with unexpected qualifiers}}
+ (void)__builtin_va_arg(args2, int); // expected-warning {{va_arg applied to va_list type '__builtin_va_list const' with unexpected qualifiers}}
}