]> granicus.if.org Git - clang/commitdiff
Fix off-by-one error when emitting diagnostics. Also, make diagnostic
authorChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 03:09:58 +0000 (03:09 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 03:09:58 +0000 (03:09 +0000)
a bit nicer for people who pass lots of extra arguments to calls by
selecting them all instead of just the first one:

arg-duplicate.c:13:13: error: too many arguments to function
  f3 (1, 1, 2, 3, 4);   // expected-error {{too many arguments to function}}
            ^~~~~~~

This implements test/Sema/arg-duplicate.c, thanks to Neil for pointing
out this crash.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40136 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaExpr.cpp
test/Sema/arg-duplicate.c [new file with mode: 0644]

index bfb2d17143a1bd3e24c5604d7e7db8b710d1ba54..fc4bc865cc443d5e946360d45ada535f3977770f 100644 (file)
@@ -409,9 +409,10 @@ ParseCallExpr(ExprTy *fn, SourceLocation LParenLoc,
            Fn->getSourceRange());
     else if (NumArgsInCall > NumArgsInProto) {
       if (!proto->isVariadic()) {
-        Diag(Args[NumArgsInProto+1]->getLocStart(), 
+        Diag(Args[NumArgsInProto]->getLocStart(), 
              diag::err_typecheck_call_too_many_args, Fn->getSourceRange(),
-             Args[NumArgsInProto+1]->getSourceRange());
+             SourceRange(Args[NumArgsInProto]->getLocStart(),
+                         Args[NumArgsInCall-1]->getLocEnd()));
       }
       NumArgsToCheck = NumArgsInProto;
     }
diff --git a/test/Sema/arg-duplicate.c b/test/Sema/arg-duplicate.c
new file mode 100644 (file)
index 0000000..5d44a72
--- /dev/null
@@ -0,0 +1,15 @@
+// RUN: clang -parse-ast-check %s
+
+typedef int x; 
+int f3(y, x, 
+       x)          // expected-error {{redefinition of parameter}}
+  int y, x, 
+      x;           // expected-error {{redefinition of parameter}}
+{
+  return x + y; 
+} 
+
+void f4(void) { 
+  f3 (1, 1, 2, 3, 4);   // expected-error {{too many arguments to function}}
+}
+