Last patch, for now, to privde ObjC's encoding of types.

We now pass all gcc's encoding compatibility tests.

llvm-svn: 61387
This commit is contained in:
Fariborz Jahanian 2008-12-23 21:30:15 +00:00
parent 8b9ccca5e5
commit 4ecf1e94db
2 changed files with 20 additions and 1 deletions

View File

@ -1859,6 +1859,16 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
return;
}
else if (PointeeTy->isObjCInterfaceType()) {
if (dyn_cast<TypedefType>(PointeeTy.getTypePtr())) {
// Another historical/compatibility reason.
// We encode the underlying type which comes out as
// {...};
S += '^';
getObjCEncodingForTypeImpl(PointeeTy, S,
false, ExpandPointedToStructures,
NULL);
return;
}
S += '@';
if (FD) {
ObjCInterfaceDecl *OI = PointeeTy->getAsObjCInterfaceType()->getDecl();

View File

@ -3,7 +3,8 @@
// 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 "r^{S=i}" %t | count 1
// RUN: grep -e "r^{S=i}" %t | count 1 &&
// RUN: grep -e "\^{Object=#}" %t | count 1
@class Int1;
@ -75,11 +76,19 @@ struct Innermost {
struct S { int iS; };
@interface Object
{
Class isa;
}
@end
typedef Object MyObj;
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);
const char *ee = @encode(MyObj *const);
}