]> granicus.if.org Git - clang/commitdiff
More encoding support; in this case, encoding of
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 22 Dec 2008 23:22:27 +0000 (23:22 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 22 Dec 2008 23:22:27 +0000 (23:22 +0000)
outer-most const of pointer types.

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

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
test/CodeGenObjC/encode-test.m

index 35b48e96f705dd10f06f522fbebb6a2a6a8ffada..4ac1c5d764cad2b4264c91a22e77e0c681db4821 100644 (file)
@@ -546,7 +546,8 @@ private:
   void getObjCEncodingForTypeImpl(QualType t, std::string &S, 
                                   bool ExpandPointedToStructures,
                                   bool ExpandStructures,
-                                  FieldDecl *Field) const;
+                                  FieldDecl *Field,
+                                  bool OutermostType = false) const;
   
 };
   
index f81d41aa61f2df3e2c3d7f159f01ab2adc8facaf..ad6c0dfc6c19b2e068157ba9bb6cda3f738c8141 100644 (file)
@@ -1755,13 +1755,15 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
   // directly pointed to, and expanding embedded structures. Note that
   // these rules are sufficient to prevent recursive encoding of the
   // same type.
-  getObjCEncodingForTypeImpl(T, S, true, true, Field);
+  getObjCEncodingForTypeImpl(T, S, true, true, Field, 
+                             true /* outermost type */);
 }
 
 void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
                                             bool ExpandPointedToStructures,
                                             bool ExpandStructures,
-                                            FieldDecl *FD) const {
+                                            FieldDecl *FD,
+                                            bool OutermostType) const {
   if (const BuiltinType *BT = T->getAsBuiltinType()) {
     if (FD && FD->isBitField()) {
       const Expr *E = FD->getBitWidth();
@@ -1805,6 +1807,8 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
   }
   else if (const PointerType *PT = T->getAsPointerType()) {
     QualType PointeeTy = PT->getPointeeType();
+    if (OutermostType && PointeeTy.isConstQualified())
+      S += 'r';
     if (isObjCIdType(PointeeTy)) {
       S += '@';
       return;
@@ -1879,6 +1883,9 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
           getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 
                                      (*Field));
         } else {
+          // FIXME! Another legacy kludge: 32-bit longs are encoded as 
+          // 'l' or 'L', but not always.  For typedefs, we need to use 
+          // 'i' or 'I' instead if encoding a struct field, or a pointer! 
           getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 
                                      FD);
         }
index 8e894c4220a803d3d7d26fb45c2dc9d22b37cd99..0ae4f13c50208ed242f2f4945cfa5807893334c7 100644 (file)
@@ -2,7 +2,8 @@
 // RUN: grep -e "\^{Innermost=CC}" %t | count 1 &&
 // RUN: grep -e "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}" %t | count 1 &&
 // RUN: grep -e "{B1=#@c}" %t | count 1 &&
-// RUN: grep -e "v12@0:4\[3\[4{Test=i}]]8" %t | count 1
+// RUN: grep -e "v12@0:4\[3\[4{Test=i}]]8" %t | count 1 &&
+// RUN: grep -e "r^{S=i}" %t | count 1
 
 @class Int1;
 
@@ -72,10 +73,13 @@ struct Innermost {
 -(void) test3: (Test [3] [4])b {}
 @end
 
+struct S { int iS; };
 
 int main()
 {
        const char *en = @encode(Derived);
        const char *eb = @encode(B1);
+        const char *es = @encode(const struct S *);
+        const char *ec = @encode(const struct S);
 }