]> granicus.if.org Git - clang/commitdiff
Do not parse members of incomplete class.
authorSerge Pavlov <sepavloff@gmail.com>
Wed, 10 Jun 2015 19:06:59 +0000 (19:06 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Wed, 10 Jun 2015 19:06:59 +0000 (19:06 +0000)
If definition of a class is unknown and out-of-line definition of its
member is encountered, do not parse the member declaration.
This change fixes PR18542.

Differential Revision: http://reviews.llvm.org/D8010

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

lib/Sema/SemaDecl.cpp
test/SemaCXX/incomplete-call.cpp

index 047958e2fc2ac86cea4418d0eb56223db34d5910..1c0eea72dd85954a0bc9d623424c7c349d2f12b8 100644 (file)
@@ -4663,12 +4663,14 @@ NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D,
         RequireCompleteDeclContext(D.getCXXScopeSpec(), DC))
       return nullptr;
 
+    // If a class is incomplete, do not parse entities inside it.
     if (isa<CXXRecordDecl>(DC) && !cast<CXXRecordDecl>(DC)->hasDefinition()) {
       Diag(D.getIdentifierLoc(),
            diag::err_member_def_undefined_record)
         << Name << DC << D.getCXXScopeSpec().getRange();
-      D.setInvalidType();
-    } else if (!D.getDeclSpec().isFriendSpecified()) {
+      return nullptr;
+    }
+    if (!D.getDeclSpec().isFriendSpecified()) {
       if (diagnoseQualifiedDeclaration(D.getCXXScopeSpec(), DC,
                                       Name, D.getIdentifierLoc())) {
         if (DC->isRecord())
index 69eb03a3eda7d788bb94df40df90727d0c49e140..6f5169ee8aa0528c59357296cf93188b48632c28 100644 (file)
@@ -47,3 +47,15 @@ struct C; // expected-note{{forward declaration}}
 void test_incomplete_object_call(C& c) {
   c(); // expected-error{{incomplete type in call to object of type}}
 }
+
+namespace pr18542 {
+  struct X {
+    int count;
+    template<typename CharT> class basic_istream;
+    template<typename CharT>
+      void basic_istream<CharT>::read() { // expected-error{{out-of-line definition of 'read' from class 'basic_istream<CharT>' without definition}}
+        count = 0;
+      }
+  };
+}
+