From: Fariborz Jahanian Date: Sat, 20 Jun 2009 20:23:38 +0000 (+0000) Subject: Made improvements in c++'s object model patch on Doug's review. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3da83eb7bcfa6bd476ab804ecb6cf755b39a6f92;p=clang Made improvements in c++'s object model patch on Doug's review. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73833 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 6bd925797a..755cfce4d8 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -580,13 +580,13 @@ def err_param_default_argument_nonfunc : Error< "default arguments can only be specified for parameters in a function " "declaration">; def err_defining_default_ctor : Error< - "cannot define the default constructor for %0, because %1 does not " - "have any default constructor">; -def not_previous_class_decl : Note< - "class %0 declared here">; + "cannot define the default constructor for %0, because %select{base class|member}1 " + "%2 does not have any implicit default constructor">; +def note_previous_class_decl : Note< + "%0 declared here">; def err_unintialized_member : Error< - "cannot define the default constructor for %0, because of " - "unintialized %select{reference|const}1 member">; + "cannot define the implicit default constructor for %0, because " + "%select{reference|const}1 member %2 cannot be default-initialized">; def err_use_of_default_argument_to_function_declared_later : Error< "use of default argument to function %0 that is declared later in class %1">; diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 7524cbf500..6d740eb5b7 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1866,9 +1866,10 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, } else { Diag(CurrentLocation, diag::err_defining_default_ctor) - << ClassDecl->getNameAsCString() << BaseClassDecl->getNameAsCString(); - Diag(BaseClassDecl->getLocation(), diag::not_previous_class_decl) - << BaseClassDecl->getNameAsCString(); + << Context.getTagDeclType(ClassDecl) << 1 + << Context.getTagDeclType(BaseClassDecl); + Diag(BaseClassDecl->getLocation(), diag::note_previous_class_decl) + << Context.getTagDeclType(BaseClassDecl); err = true; } } @@ -1890,22 +1891,22 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, } else { Diag(CurrentLocation, diag::err_defining_default_ctor) - << ClassDecl->getNameAsCString() << - FieldClassDecl->getNameAsCString(); - Diag(FieldClassDecl->getLocation(), diag::not_previous_class_decl) - << FieldClassDecl->getNameAsCString(); + << Context.getTagDeclType(ClassDecl) << 0 << + Context.getTagDeclType(FieldClassDecl); + Diag(FieldClassDecl->getLocation(), diag::note_previous_class_decl) + << Context.getTagDeclType(FieldClassDecl); err = true; } } else if (FieldType->isReferenceType()) { Diag(CurrentLocation, diag::err_unintialized_member) - << ClassDecl->getNameAsCString() << 0; + << Context.getTagDeclType(ClassDecl) << 0 << (*Field)->getNameAsCString(); Diag((*Field)->getLocation(), diag::note_declared_at); err = true; } else if (FieldType.isConstQualified()) { Diag(CurrentLocation, diag::err_unintialized_member) - << ClassDecl->getNameAsCString() << 1; + << Context.getTagDeclType(ClassDecl) << 1 << (*Field)->getNameAsCString(); Diag((*Field)->getLocation(), diag::note_declared_at); err = true; } diff --git a/test/SemaCXX/default-constructor-initializers.cpp b/test/SemaCXX/default-constructor-initializers.cpp new file mode 100644 index 0000000000..c5250f8912 --- /dev/null +++ b/test/SemaCXX/default-constructor-initializers.cpp @@ -0,0 +1,56 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +struct X1 { // has no implicit default constructor + X1(int); +}; + +struct X2 : X1 { // expected-note {{'struct X2' declared here}} \ + // expected-note {{'struct X2' declared here}} + X2(int); +}; + +struct X3 : public X2 { +}; +X3 x3; // expected-error {{cannot define the default constructor for 'struct X3', because member 'struct X2' does not have any implicit default constructor}} + + +struct X4 { + X2 x2; + X2 & rx2; // expected-note {{declared at}} +}; + +X4 x4; // expected-error {{cannot define the default constructor for 'struct X4', because base class 'struct X2' does not have any implicit default constructor}} \ + // expected-error {{cannot define the implicit default constructor for 'struct X4', because reference member rx2 cannot be default-initialized}} + + +struct Y1 { // has no implicit default constructor + Y1(int); +}; + +struct Y2 : Y1 { + Y2(int); + Y2(); +}; + +struct Y3 : public Y2 { +}; +Y3 y3; + +struct Y4 { + Y2 y2; +}; + +Y4 y4; + +// More tests + + +struct Z1 { + int& z; // expected-note {{declared at}} + const int c1; // expected-note {{declared at}} + volatile int v1; +}; + +Z1 z1; // expected-error {{cannot define the implicit default constructor for 'struct Z1', because reference member z cannot be default-initialized}} \ + // expected-error {{cannot define the implicit default constructor for 'struct Z1', because const member c1 cannot be default-initialized}} + diff --git a/test/SemaCXX/default-contructor-initializers.cpp b/test/SemaCXX/default-contructor-initializers.cpp deleted file mode 100644 index c21a0210e1..0000000000 --- a/test/SemaCXX/default-contructor-initializers.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// RUN: clang-cc -fsyntax-only -verify %s - -struct X1 { // has no implicit default constructor - X1(int); -}; - -struct X2 : X1 { // expected-note {{class X2 declared here}} \ - // expected-note {{class X2 declared here}} - X2(int); -}; - -struct X3 : public X2 { -}; -X3 x3; // expected-error {{cannot define the default constructor for X3, because X2 does not have any default constructor}} - - -struct X4 { - X2 x2; - X2 & rx2; // expected-note {{declared at}} -}; - -X4 x4; // expected-error {{cannot define the default constructor for X4, because X2 does not have any default constructor}} \ - // expected-error {{cannot define the default constructor for X4, because of unintialized reference member}} - - -struct Y1 { // has no implicit default constructor - Y1(int); -}; - -struct Y2 : Y1 { - Y2(int); - Y2(); -}; - -struct Y3 : public Y2 { -}; -Y3 y3; - -struct Y4 { - Y2 y2; -}; - -Y4 y4; - -// More tests - - -struct Z1 { - int& z; // expected-note {{declared at}} - const int c1; // expected-note {{declared at}} - volatile int v1; -}; - -Z1 z1; // expected-error {{cannot define the default constructor for Z1, because of unintialized const member}} \ - // expected-error {{cannot define the default constructor for Z1, because of unintialized reference member}} -