]> granicus.if.org Git - clang/commitdiff
generalize some of the conversion warnings.
authorChris Lattner <sabre@nondot.org>
Thu, 3 Jan 2008 23:38:43 +0000 (23:38 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 3 Jan 2008 23:38:43 +0000 (23:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45560 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/Sema.cpp
Sema/Sema.h
Sema/SemaExpr.cpp
include/clang/Basic/DiagnosticKinds.def
test/Sema/argument-checking.m

index 7bdcd0a214c705c8e0ff2e259595ef31cb0442da..bca3ec508bf29185407ef5f09e12879339296bb7 100644 (file)
@@ -152,6 +152,14 @@ bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1,
   return true;
 }
 
+bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 
+                const std::string &Msg2, const std::string &Msg3, 
+                SourceRange R1) {
+  std::string MsgArr[] = { Msg1, Msg2, Msg3 };
+  PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 3, &R1, 1);
+  return true;
+}
+
 bool Sema::Diag(SourceLocation Loc, unsigned DiagID,
                 SourceRange R1, SourceRange R2) {
   SourceRange RangeArr[] = { R1, R2 };
index 33fd345d00f382e1f72205a79e382412a9db3e56..8846d158134f3195284f4b44a626a2490bfe3690 100644 (file)
@@ -159,6 +159,8 @@ public:
             SourceRange R1, SourceRange R2);
   bool Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 
             const std::string &Msg2, SourceRange R1);
+  bool Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 
+            const std::string &Msg2, const std::string &Msg3, SourceRange R1);
   bool Diag(SourceLocation Loc, unsigned DiagID, 
             const std::string &Msg1, const std::string &Msg2, 
             SourceRange R1, SourceRange R2);
index bab7d3d7e9b5bd9f12242dacc0c622d1dab58489..de642c6e65e18b87f4f71a6fc317cad449ad3be4 100644 (file)
@@ -2229,38 +2229,35 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs,
       Args[i] = argExpr; // Make sure we store the converted expression.
     SourceLocation l = argExpr->getLocStart();
 
-    // decode the result (notice that AST's are still created for extensions).
+    // Decode the result (notice that AST's are still created for extensions).
+    const char *Kind = "sending";
     switch (result) {
     case Compatible:
       break;
     case PointerFromInt:
-      Diag(l, diag::ext_typecheck_sending_pointer_int, 
-           lhsType.getAsString(), rhsType.getAsString(),
-           argExpr->getSourceRange());
-      break;
     case IntFromPointer:
-      Diag(l, diag::ext_typecheck_sending_pointer_int, 
-           lhsType.getAsString(), rhsType.getAsString(),
+      Diag(l, diag::ext_typecheck_convert_pointer_int, 
+           lhsType.getAsString(), rhsType.getAsString(), Kind,
            argExpr->getSourceRange());
       break;
     case IncompatiblePointer:
-      Diag(l, diag::ext_typecheck_sending_incompatible_pointer, 
-           rhsType.getAsString(), lhsType.getAsString(),
+      Diag(l, diag::ext_typecheck_convert_incompatible_pointer, 
+           lhsType.getAsString(), rhsType.getAsString(), Kind,
            argExpr->getSourceRange());
       break;
     case FunctionVoidPointer:
-      Diag(l, diag::ext_typecheck_sending_pointer_void_func, 
-           rhsType.getAsString(), lhsType.getAsString(),
+      Diag(l, diag::ext_typecheck_convert_pointer_void_func, 
+           lhsType.getAsString(), rhsType.getAsString(), Kind,
            argExpr->getSourceRange());
       break;
     case CompatiblePointerDiscardsQualifiers:
-      Diag(l, diag::ext_typecheck_sending_discards_qualifiers,
-           rhsType.getAsString(), lhsType.getAsString(),
+      Diag(l, diag::ext_typecheck_convert_discards_qualifiers,
+           lhsType.getAsString(), rhsType.getAsString(), Kind,
            argExpr->getSourceRange());
       break;
     case Incompatible:
-      Diag(l, diag::err_typecheck_sending_incompatible,
-           rhsType.getAsString(), lhsType.getAsString(),
+      Diag(l, diag::err_typecheck_convert_incompatible,
+           lhsType.getAsString(), rhsType.getAsString(), Kind,
            argExpr->getSourceRange());
       anyIncompatibleArgs = true;
     }
index c97e52a6b5818b8ef86d780162bcae63d2b685bc..136f6021bb93a0190c2015f3508ae962b795174c 100644 (file)
@@ -759,6 +759,18 @@ DIAG(ext_typecheck_comparison_of_distinct_pointers, WARNING,
      "comparison of distinct pointer types ('%0' and '%1')")
 DIAG(err_typecheck_assign_const, ERROR,
      "read-only variable is not assignable")
+
+DIAG(err_typecheck_convert_incompatible, ERROR,
+     "incompatible type %2 '%1', expected '%0'")
+DIAG(ext_typecheck_convert_pointer_int, EXTENSION,
+     "incompatible pointer/int conversion %2 '%1', expected '%0'")
+DIAG(ext_typecheck_convert_pointer_void_func, EXTENSION,
+     "%2 '%1' converts between void* and function pointer, expected '%0'")
+DIAG(ext_typecheck_convert_incompatible_pointer, EXTENSION,
+     "incompatible pointer types %d '%1', expected '%0'")
+DIAG(ext_typecheck_convert_discards_qualifiers, EXTENSION,
+     "%d '%1' discards qualifiers, expected '%0'")
+
      
      
 DIAG(err_typecheck_return_incompatible, ERROR,
@@ -796,18 +808,6 @@ DIAG(ext_typecheck_passing_pointer_void_func, EXTENSION,
 DIAG(ext_typecheck_passing_discards_qualifiers, WARNING,
      "passing '%0' to '%1' discards qualifiers")
      
-DIAG(err_typecheck_sending_incompatible, ERROR,
-     "incompatible types passing '%0' to method expecting '%1'")
-DIAG(ext_typecheck_sending_incompatible_pointer, WARNING,
-     "incompatible pointer types passing '%0' to method expecting '%1'")
-DIAG(ext_typecheck_sending_pointer_int, WARNING,
-     "incompatible types passing '%1' to method expecting '%0'")
-DIAG(ext_typecheck_sending_pointer_void_func, EXTENSION,
-     "sending '%1' to method expecting '%0' converts between void*"
-     " and function pointer")
-DIAG(ext_typecheck_sending_discards_qualifiers, WARNING,
-     "sending '%0' to '%1' discards qualifiers")
-
      
 DIAG(err_typecheck_array_not_modifiable_lvalue, ERROR,
      "array type '%0' is not assignable")
index 851a874c9359b92cbf84a7b6386770088760a86c..57ab14f1ff21b2002a8abe2bd9e624b43b574742 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify -pedantic %s
 
 struct S { int a; };
 
@@ -19,7 +19,7 @@ void test() {
   charStarFunc(1); // expected-warning {{incompatible types passing 'int' to function expecting 'char *'}}
   charFunc("abc"); // expected-warning {{incompatible types passing 'char *' to function expecting 'char'}}
 
-  [obj charStarMeth:1]; // expected-warning {{incompatible types passing 'int' to method expecting 'char *'}}
-  [obj structMeth:1]; // expected-error {{incompatible types passing 'int' to method expecting 'struct S'}}
-  [obj structMeth:sInst :1]; // expected-error {{incompatible types passing 'int' to method expecting 'struct S'}}
+  [obj charStarMeth:1]; // expected-warning {{incompatible pointer/int conversion sending 'int'}}
+  [obj structMeth:1]; // expected-error {{incompatible type sending 'int'}}
+  [obj structMeth:sInst :1]; // expected-error {{incompatible type sending 'int'}}
 }