]> granicus.if.org Git - clang/commitdiff
Revert r163078 per chandlerc's request.
authorJoao Matos <ripzonetriton@gmail.com>
Tue, 4 Sep 2012 17:18:12 +0000 (17:18 +0000)
committerJoao Matos <ripzonetriton@gmail.com>
Tue, 4 Sep 2012 17:18:12 +0000 (17:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163145 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/AST/MicrosoftCXXABI.cpp
lib/Sema/SemaDeclAttr.cpp
lib/Sema/SemaType.cpp
test/SemaCXX/member-pointer-ms.cpp

index 95fa22806b95a4f4c0a1fcaf415d5ba1734c8653..e0dac62403e278331bbc5d6933d7197fd8db4f2c 100644 (file)
@@ -1672,9 +1672,7 @@ def warn_objc_redundant_literal_use : Warning<
 
 def err_attr_tlsmodel_arg : Error<"tls_model must be \"global-dynamic\", "
   "\"local-dynamic\", \"initial-exec\" or \"local-exec\"">;
-def warn_ms_inheritance_already_declared : Warning<
-  "ignored since inheritance model was already declared as '"
-  "%select{single|multiple|virtual}0'">, InGroup<Microsoft>;
+
 def err_only_annotate_after_access_spec : Error<
   "access specifier can only have annotation attributes">;
 
index 575272d357313dae01acc0f9c778f759daa93d33..51308ea0c0f550fe694ecb77b99ee132a97443c2 100644 (file)
@@ -55,16 +55,6 @@ public:
 unsigned MicrosoftCXXABI::getMemberPointerSize(const MemberPointerType *MPT) const {
   QualType Pointee = MPT->getPointeeType();
   CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
-
-  if (RD->getTypeForDecl()->isIncompleteType()) {
-    if (RD->hasAttr<SingleInheritanceAttr>())
-      return 1;
-    else if (RD->hasAttr<MultipleInheritanceAttr>())
-      return 2;
-    else
-      return 3;
-  }
-
   if (RD->getNumVBases() > 0) {
     if (Pointee->isFunctionType())
       return 3;
index bf1c14338db1460141e57e88393f8748431de169..50d11175995c4ac7ed4829e3ff423d3cff483580 100644 (file)
@@ -4149,50 +4149,20 @@ static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
 }
 
-static bool hasOtherInheritanceAttr(Decl *D, AttributeList::Kind Kind,
-    int& Existing) {
-  if (Kind != AttributeList::AT_SingleInheritance &&
-      D->hasAttr<SingleInheritanceAttr>()) {
-    Existing = 0;
-    return true;
-  }
-  else if (Kind != AttributeList::AT_MultipleInheritance &&
-      D->hasAttr<MultipleInheritanceAttr>()) {
-    Existing = 1;
-    return true;
-  }
-  else if (Kind != AttributeList::AT_VirtualInheritance &&
-      D->hasAttr<VirtualInheritanceAttr>()) {
-    Existing = 2;
-    return true;
-  }
-  return false;
-}
-
 static void handleInheritanceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
-  if (!S.LangOpts.MicrosoftExt) {
+  if (S.LangOpts.MicrosoftExt) {
+    AttributeList::Kind Kind = Attr.getKind();
+    if (Kind == AttributeList::AT_SingleInheritance)
+      D->addAttr(
+          ::new (S.Context) SingleInheritanceAttr(Attr.getRange(), S.Context));
+    else if (Kind == AttributeList::AT_MultipleInheritance)
+      D->addAttr(
+          ::new (S.Context) MultipleInheritanceAttr(Attr.getRange(), S.Context));
+    else if (Kind == AttributeList::AT_VirtualInheritance)
+      D->addAttr(
+          ::new (S.Context) VirtualInheritanceAttr(Attr.getRange(), S.Context));
+  } else
     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
-    return;
-  }
-
-  AttributeList::Kind Kind = Attr.getKind();
-
-  int Existing;
-  if (hasOtherInheritanceAttr(D->getCanonicalDecl(), Kind, Existing)) {
-      S.Diag(Attr.getLoc(), diag::warn_ms_inheritance_already_declared) << Existing;
-      return;
-  }
-
-  if (Kind == AttributeList::AT_SingleInheritance) {
-    D->addAttr(
-        ::new (S.Context) SingleInheritanceAttr(Attr.getRange(), S.Context));
-  } else if (Kind == AttributeList::AT_MultipleInheritance) {
-    D->addAttr(
-        ::new (S.Context) MultipleInheritanceAttr(Attr.getRange(), S.Context));
-  } else if (Kind == AttributeList::AT_VirtualInheritance) {
-    D->addAttr(
-        ::new (S.Context) VirtualInheritanceAttr(Attr.getRange(), S.Context));
-  }
 }
 
 static void handlePortabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
index 68cd5cdcf833866b31e37389e3144329f080ddae..82dccfa5f442f9993ddd38782aa1e4b5c2206229 100644 (file)
@@ -1583,6 +1583,14 @@ QualType Sema::BuildMemberPointerType(QualType T, QualType Class,
     return QualType();
   }
 
+  // In the Microsoft ABI, the class is allowed to be an incomplete
+  // type. In such cases, the compiler makes a worst-case assumption.
+  // We make no such assumption right now, so emit an error if the
+  // class isn't a complete type.
+  if (Context.getTargetInfo().getCXXABI() == CXXABI_Microsoft &&
+      RequireCompleteType(Loc, Class, diag::err_incomplete_type))
+    return QualType();
+
   return Context.getMemberPointerType(T, Class.getTypePtr());
 }
 
index 90618bc7dce13e22c13a5942eab9ab88d21401cc..3b2d0fceb9788afc40d6ccd544126eb6b4a8d8ac 100644 (file)
@@ -1,4 +1,8 @@
-// RUN: %clang_cc1 -cxx-abi microsoft -fms-compatibility -fsyntax-only -verify %s
+// RUN: %clang_cc1 -cxx-abi microsoft -fsyntax-only -verify %s
+
+// Test that we reject pointers to members of incomplete classes (for now)
+struct A; //expected-note{{forward declaration of 'A'}}
+int A::*pai1; //expected-error{{incomplete type 'A'}}
 
 // Test that we don't allow reinterpret_casts from pointers of one size to
 // pointers of a different size.
@@ -8,9 +12,3 @@ struct C: A, B {};
 
 void (A::*paf)();
 void (C::*pcf)() = reinterpret_cast<void (C::*)()>(paf); //expected-error{{cannot reinterpret_cast from member pointer type}}
-
-class __single_inheritance D; 
-class __multiple_inheritance D; // expected-warning {{ignored since inheritance model was already declared as 'single'}}
-  
-class __virtual_inheritance E;
-class __virtual_inheritance E;  // no warning expected since same attribute