]> granicus.if.org Git - clang/commitdiff
MS ABI: Don't be so hasty to judge an inheritance model
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 7 Feb 2014 00:43:07 +0000 (00:43 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 7 Feb 2014 00:43:07 +0000 (00:43 +0000)
If we are in the middle of defining the class, don't attempt to
validate previously annotated declarations.  We may not have seen base
specifiers or virtual method declarations yet.

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

lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclAttr.cpp
test/SemaCXX/member-pointer-ms.cpp

index 8b750812d9c3d15ae4b6b8ebca16c232c5aab9f8..dd059bbb098c14f2e795b26dee5c211144559035 100644 (file)
@@ -12150,7 +12150,7 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
     if (Record->hasAttrs()) {
       CheckAlignasUnderalignment(Record);
 
-      if (MSInheritanceAttr *IA = Record->getAttr<MSInheritanceAttr>())
+      if (const MSInheritanceAttr *IA = Record->getAttr<MSInheritanceAttr>())
         checkMSInheritanceAttrOnDefinition(cast<CXXRecordDecl>(Record),
                                            IA->getRange(),
                                            IA->getSemanticSpelling());
index 50ec236fb7918a0f65cffbc976eb674676d55aeb..66591e4bf36035177f9b9cc9a923bde65bbd7538 100644 (file)
@@ -2877,16 +2877,23 @@ bool Sema::checkMSInheritanceAttrOnDefinition(
     MSInheritanceAttr::Spelling SemanticSpelling) {
   assert(RD->hasDefinition() && "RD has no definition!");
 
-  if (SemanticSpelling != MSInheritanceAttr::Keyword_unspecified_inheritance &&
-      RD->calculateInheritanceModel() != SemanticSpelling) {
-    Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
-        << 0 /*definition*/;
-    Diag(RD->getDefinition()->getLocation(), diag::note_defined_here)
-        << RD->getNameAsString();
-    return true;
-  }
+  // We may not have seen base specifiers or any virtual methods yet.  We will
+  // have to wait until the record is defined to catch any mismatches.
+  if (!RD->getDefinition()->isCompleteDefinition())
+    return false;
 
-  return false;
+  // The unspecified model never matches what a definition could need.
+  if (SemanticSpelling == MSInheritanceAttr::Keyword_unspecified_inheritance)
+    return false;
+
+  if (RD->calculateInheritanceModel() == SemanticSpelling)
+    return false;
+
+  Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
+      << 0 /*definition*/;
+  Diag(RD->getDefinition()->getLocation(), diag::note_defined_here)
+      << RD->getNameAsString();
+  return true;
 }
 
 /// handleModeAttr - This attribute modifies the width of a decl with primitive
index aa3caa74285072d6fce7791ec4b8ce0e11dd06f4..8e8094004f6fcfc7b630d1adc55cc3404976c7da 100644 (file)
@@ -198,4 +198,7 @@ struct __multiple_inheritance B; // expected-error{{inheritance model does not m
 
 struct __multiple_inheritance C {}; // expected-error{{inheritance model does not match definition}}
  // expected-note@-1 {{C defined here}}
+
+struct __virtual_inheritance D;
+struct D : virtual B {};
 }