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.
Details
Diff Detail
Event Timeline
Any feedback?
Thanks,
--Serge
2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
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.Files:
lib/Sema/SemaDecl.cpp test/SemaCXX/incomplete-call.cppIndex: lib/Sema/SemaDecl.cpp
- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -4573,12 +4573,14 @@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: test/SemaCXX/incomplete-call.cpp
- test/SemaCXX/incomplete-call.cpp
+++ test/SemaCXX/incomplete-call.cpp
@@ -47,3 +47,15 @@
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;
+ }
+ };
+}
+EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Ping.
Thanks,
--Serge
2015-03-12 23:30 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Any feedback?
Thanks,
--Serge2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
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.Files:
lib/Sema/SemaDecl.cpp test/SemaCXX/incomplete-call.cppIndex: lib/Sema/SemaDecl.cpp
- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -4573,12 +4573,14 @@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: test/SemaCXX/incomplete-call.cpp
- test/SemaCXX/incomplete-call.cpp
+++ test/SemaCXX/incomplete-call.cpp
@@ -47,3 +47,15 @@
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;
+ }
+ };
+}
+EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Ping.
Thanks,
--Serge
2015-03-19 10:22 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Ping.
Thanks,
--Serge2015-03-12 23:30 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Any feedback?
Thanks,
--Serge2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
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.Files:
lib/Sema/SemaDecl.cpp test/SemaCXX/incomplete-call.cppIndex: lib/Sema/SemaDecl.cpp
- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -4573,12 +4573,14 @@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: test/SemaCXX/incomplete-call.cpp
- test/SemaCXX/incomplete-call.cpp
+++ test/SemaCXX/incomplete-call.cpp
@@ -47,3 +47,15 @@
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;
+ }
+ };
+}
+EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Any feedback?
Thanks,
--Serge
2015-04-16 0:52 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Ping.
Thanks,
--Serge2015-03-19 10:22 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Ping.
Thanks,
--Serge2015-03-12 23:30 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Any feedback?
Thanks,
--Serge2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
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.Files:
lib/Sema/SemaDecl.cpp test/SemaCXX/incomplete-call.cppIndex: lib/Sema/SemaDecl.cpp
- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -4573,12 +4573,14 @@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: test/SemaCXX/incomplete-call.cpp
- test/SemaCXX/incomplete-call.cpp
+++ test/SemaCXX/incomplete-call.cpp
@@ -47,3 +47,15 @@
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;
+ }
+ };
+}
+EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Ping!
Thanks,
--Serge
2015-05-25 18:15 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Any feedback?
Thanks,
--Serge2015-04-16 0:52 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Ping.
Thanks,
--Serge2015-03-19 10:22 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Ping.
Thanks,
--Serge2015-03-12 23:30 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
Any feedback?
Thanks,
--Serge2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
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.Files:
lib/Sema/SemaDecl.cpp test/SemaCXX/incomplete-call.cppIndex: lib/Sema/SemaDecl.cpp
- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -4573,12 +4573,14 @@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: test/SemaCXX/incomplete-call.cpp
- test/SemaCXX/incomplete-call.cpp
+++ test/SemaCXX/incomplete-call.cpp
@@ -47,3 +47,15 @@
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;
+ }
+ };
+}
+EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/