[cfe-commits] r86402 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/Sema.h lib/Sema/SemaExpr.cpp

Fariborz Jahanian fjahanian at apple.com
Sat Nov 7 12:20:40 PST 2009


Author: fjahanian
Date: Sat Nov  7 14:20:40 2009
New Revision: 86402

URL: http://llvm.org/viewvc/llvm-project?rev=86402&view=rev
Log:
Patch to gives an error that at least points users in the direction of the error, rather 
than an error about incompatible types. Patch by Sean Hunt.


Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=86402&r1=86401&r2=86402&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Nov  7 14:20:40 2009
@@ -1839,6 +1839,8 @@
   "incompatible pointer types %2 %1, expected %0">;
 def ext_typecheck_convert_discards_qualifiers : ExtWarn<
   "%2 %1 discards qualifiers, expected %0">;
+def err_multi_pointer_qualifier_mismatch : Error<
+  "%2, %0 and %1 have different qualifiers in a multi-level pointer chain">;
 def warn_incompatible_vectors : Warning<
   "incompatible vector types %2 %1, expected %0">,
   InGroup<VectorConversions>, DefaultIgnore;

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=86402&r1=86401&r2=86402&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Sat Nov  7 14:20:40 2009
@@ -3485,6 +3485,12 @@
     /// CompatiblePointerDiscardsQualifiers - The assignment discards
     /// c/v/r qualifiers, which we accept as an extension.
     CompatiblePointerDiscardsQualifiers,
+    
+    /// IncompatibleMultiPointerQualifiers - The assignment is between two
+    /// multi-level pointer types, and the qualifiers other than the first two
+    /// levels differ e.g. char ** -> const char **. We disallow this.
+    /// FIXME: GCC only warns for this - should we do the same?
+    IncompatibleMultiPointerQualifiers,
 
     /// IncompatibleVectors - The assignment is between two vector types that
     /// have the same size, which we accept as an extension.

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=86402&r1=86401&r2=86402&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat Nov  7 14:20:40 2009
@@ -3747,6 +3747,24 @@
         return ConvTy;
       return IncompatiblePointerSign;
     }
+    
+    // If we are a multi-level pointer, it's possible that our issue is simply
+    // one of qualification - e.g. char ** -> const char ** is not allowed. If
+    // the eventual target type is the same and the pointers have the same
+    // level of indirection, this must be the issue.
+    if (lhptee->isPointerType() && rhptee->isPointerType()) {
+      do {
+        lhptee = lhptee->getAs<PointerType>()->getPointeeType();
+        rhptee = rhptee->getAs<PointerType>()->getPointeeType();
+      
+        lhptee = Context.getCanonicalType(lhptee);
+        rhptee = Context.getCanonicalType(rhptee);
+      } while (lhptee->isPointerType() && rhptee->isPointerType());
+      
+      if (lhptee.getUnqualifiedType() == rhptee.getUnqualifiedType())
+        return IncompatibleMultiPointerQualifiers;
+    }
+    
     // General pointer incompatibility takes priority over qualifiers.
     return IncompatiblePointer;
   }
@@ -6223,6 +6241,9 @@
       return false;
     DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
     break;
+  case IncompatibleMultiPointerQualifiers:
+    DiagKind = diag::err_multi_pointer_qualifier_mismatch;
+    break;
   case IntToBlockPointer:
     DiagKind = diag::err_int_to_block_pointer;
     break;





More information about the cfe-commits mailing list