diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
| -rw-r--r-- | clang/lib/AST/MicrosoftCXXABI.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 54 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 8 | ||||
| -rw-r--r-- | clang/test/SemaCXX/member-pointer-ms.cpp | 12 | 
5 files changed, 26 insertions, 62 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 95fa22806b9..e0dac62403e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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">; diff --git a/clang/lib/AST/MicrosoftCXXABI.cpp b/clang/lib/AST/MicrosoftCXXABI.cpp index 575272d3573..51308ea0c0f 100644 --- a/clang/lib/AST/MicrosoftCXXABI.cpp +++ b/clang/lib/AST/MicrosoftCXXABI.cpp @@ -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; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index bf1c14338db..50d11175995 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -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) { diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 68cd5cdcf83..82dccfa5f44 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -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());  } diff --git a/clang/test/SemaCXX/member-pointer-ms.cpp b/clang/test/SemaCXX/member-pointer-ms.cpp index 90618bc7dce..3b2d0fceb97 100644 --- a/clang/test/SemaCXX/member-pointer-ms.cpp +++ b/clang/test/SemaCXX/member-pointer-ms.cpp @@ -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  | 

