[cfe-commits] r86579 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclCXX.cpp test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp test/SemaCXX/default-constructor-initializers.cpp test/SemaCXX/value-initialization.cpp
Eli Friedman
eli.friedman at gmail.com
Mon Nov 9 11:20:37 PST 2009
Author: efriedma
Date: Mon Nov 9 13:20:36 2009
New Revision: 86579
URL: http://llvm.org/viewvc/llvm-project?rev=86579&view=rev
Log:
Add additional note to mark the cause of synthesized constructors. Mark
declaration invalid if the constructor can't be properly built. Addresses
remaining review comments from Fariborz for r86500.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp
cfe/trunk/test/SemaCXX/value-initialization.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=86579&r1=86578&r2=86579&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Nov 9 13:20:36 2009
@@ -433,6 +433,8 @@
def note_field_decl : Note<"member is declared here">;
def note_previous_class_decl : Note<
"%0 declared here">;
+def note_ctor_synthesized_at : Note<
+ "implicit default constructor for %0 first required here">;
def err_missing_default_ctor : Error<
"%select{|implicit default }0constructor for %1 must explicitly initialize "
"the %select{base class|member}2 %3 which does not have a default "
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=86579&r1=86578&r2=86579&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Nov 9 13:20:36 2009
@@ -1186,7 +1186,7 @@
NumArgs, C, IdLoc, RParenLoc);
}
-void
+bool
Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
CXXBaseOrMemberInitializer **Initializers,
unsigned NumInitializers,
@@ -1197,6 +1197,7 @@
llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
llvm::DenseMap<const void *, CXXBaseOrMemberInitializer*> AllBaseFields;
bool HasDependentBaseInit = false;
+ bool HadError = false;
for (unsigned i = 0; i < NumInitializers; i++) {
CXXBaseOrMemberInitializer *Member = Initializers[i];
@@ -1258,6 +1259,7 @@
<< 0 << VBase->getType();
Diag(VBaseDecl->getLocation(), diag::note_previous_class_decl)
<< Context.getTagDeclType(VBaseDecl);
+ HadError = true;
continue;
}
@@ -1307,6 +1309,7 @@
<< 0 << Base->getType();
Diag(BaseDecl->getLocation(), diag::note_previous_class_decl)
<< Context.getTagDeclType(BaseDecl);
+ HadError = true;
continue;
}
@@ -1378,6 +1381,7 @@
Diag(Field->getLocation(), diag::note_field_decl);
Diag(RT->getDecl()->getLocation(), diag::note_previous_class_decl)
<< Context.getTagDeclType(RT->getDecl());
+ HadError = true;
continue;
}
@@ -1399,6 +1403,7 @@
<< (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
<< 1 << (*Field)->getDeclName();
Diag((*Field)->getLocation(), diag::note_declared_at);
+ HadError = true;
}
}
else if (FT->isReferenceType()) {
@@ -1406,12 +1411,14 @@
<< (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
<< 0 << (*Field)->getDeclName();
Diag((*Field)->getLocation(), diag::note_declared_at);
+ HadError = true;
}
else if (FT.isConstQualified()) {
Diag(Constructor->getLocation(), diag::err_unintialized_member_in_ctor)
<< (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
<< 1 << (*Field)->getDeclName();
Diag((*Field)->getLocation(), diag::note_declared_at);
+ HadError = true;
}
}
@@ -1425,6 +1432,8 @@
for (unsigned Idx = 0; Idx < NumInitializers; ++Idx)
baseOrMemberInitializers[Idx] = AllToInit[Idx];
}
+
+ return HadError;
}
static void *GetKeyForTopLevelField(FieldDecl *Field) {
@@ -2957,9 +2966,17 @@
!Constructor->isUsed()) &&
"DefineImplicitDefaultConstructor - call it for implicit default ctor");
- SetBaseOrMemberInitializers(Constructor, 0, 0, true);
+ CXXRecordDecl *ClassDecl
+ = cast<CXXRecordDecl>(Constructor->getDeclContext());
+ assert(ClassDecl && "DefineImplicitDefaultConstructor - invalid constructor");
- Constructor->setUsed();
+ if (SetBaseOrMemberInitializers(Constructor, 0, 0, true)) {
+ Diag(CurrentLocation, diag::note_ctor_synthesized_at)
+ << Context.getTagDeclType(ClassDecl);
+ Constructor->setInvalidDecl();
+ } else {
+ Constructor->setUsed();
+ }
return;
}
Modified: cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp?rev=86579&r1=86578&r2=86579&view=diff
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp Mon Nov 9 13:20:36 2009
@@ -26,7 +26,7 @@
xih.g(); // okay
xih.f(); // expected-note{{instantiation}}
- X<IntHolder, int>::Inner inner;
+ X<IntHolder, int>::Inner inner; // expected-note {{first required here}}
return X<IntHolder, int>::value; // expected-note{{instantiation}}
}
Modified: cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp?rev=86579&r1=86578&r2=86579&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp (original)
+++ cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp Mon Nov 9 13:20:36 2009
@@ -11,7 +11,7 @@
struct X3 : public X2 { // expected-error {{must explicitly initialize the base class 'struct X2'}}
};
-X3 x3;
+X3 x3; // expected-note {{first required here}}
struct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \
@@ -20,7 +20,7 @@
X2 & rx2; // expected-note {{declared at}}
};
-X4 x4;
+X4 x4; // expected-note {{first required here}}
struct Y1 { // has no implicit default constructor
@@ -52,5 +52,5 @@
volatile int v1;
};
-Z1 z1;
+Z1 z1; // expected-note {{first required here}}
Modified: cfe/trunk/test/SemaCXX/value-initialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/value-initialization.cpp?rev=86579&r1=86578&r2=86579&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/value-initialization.cpp (original)
+++ cfe/trunk/test/SemaCXX/value-initialization.cpp Mon Nov 9 13:20:36 2009
@@ -6,5 +6,5 @@
};
int main () {
- (void)A();
+ (void)A(); // expected-note {{first required here}}
}
More information about the cfe-commits
mailing list