]> granicus.if.org Git - clang/commitdiff
Avoid using the "unnamed struct field" extension (enabled with -fms-extensions)....
authorSteve Naroff <snaroff@apple.com>
Wed, 12 Mar 2008 21:09:20 +0000 (21:09 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 12 Mar 2008 21:09:20 +0000 (21:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48302 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteTest.cpp

index 4ac943328a32aa9d312559c4683ff18dac041e31..b500cf537a4a6114efccb571ac0ed16ea26af9dd 100644 (file)
@@ -774,7 +774,11 @@ Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
     if (const PointerType *pType = IV->getBase()->getType()->getAsPointerType()) {
       ObjCInterfaceType *intT = dyn_cast<ObjCInterfaceType>(pType->getPointeeType());
       if (CurMethodDecl->getClassInterface() == intT->getDecl()) {
-        std::string RecName = intT->getDecl()->getIdentifier()->getName();
+        // lookup which class implements the instance variable.
+        ObjCInterfaceDecl *clsDeclared = 0;
+        intT->getDecl()->lookupInstanceVariable(D->getIdentifier(), clsDeclared);
+        assert(clsDeclared && "RewriteObjCIvarRefExpr(): Can't find class");
+        std::string RecName = clsDeclared->getIdentifier()->getName();
         RecName += "_IMPL";
         IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
         RecordDecl *RD = new RecordDecl(Decl::Struct, SourceLocation(), II, 0);
@@ -2189,14 +2193,9 @@ void RewriteTest::SynthesizeObjCInternalStruct(ObjCInterfaceDecl *CDecl,
     if (RCDecl && ObjCSynthesizedStructs.count(RCDecl)) {
       Result = "\n    struct ";
       Result += RCDecl->getName();
-      if (LangOpts.Microsoft)
-        Result += "_IMPL";
-
-      // Note: We don't name the field decl. This simplifies the "codegen" for
-      // accessing a superclasses instance variables (and is similar to what gcc
-      // does internally). The unnamed struct field feature is enabled with
-      // -fms-extensions. If the struct definition were "inlined", we wouldn't
-      // need to use this switch. That said, I don't want to inline the def.
+      Result += "_IMPL ";
+      Result += RCDecl->getName();
+      Result += "_IVARS";
       Result += ";\n";
       
       // insert the super class structure definition.
@@ -2240,14 +2239,9 @@ void RewriteTest::SynthesizeObjCInternalStruct(ObjCInterfaceDecl *CDecl,
     endBuf += Lexer::MeasureTokenLength(LocEnd, *SM);
     Result += " {\n    struct ";
     Result += RCDecl->getName();
-    if (LangOpts.Microsoft)
-      Result += "_IMPL";
-
-    // Note: We don't name the field decl. This simplifies the "codegen" for
-    // accessing a superclasses instance variables (and is similar to what gcc
-    // does internally). The unnamed struct field feature is enabled with
-    // -fms-extensions. If the struct definition were "inlined", we wouldn't
-    // need to use this switch. That said, I don't want to inline the def.
+    Result += "_IMPL ";
+    Result += RCDecl->getName();
+    Result += "_IVARS";
     Result += ";\n};\n";
     ReplaceText(LocStart, endBuf-startBuf, Result.c_str(), Result.size());
   }