summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-03-11 23:00:04 +0000
committerDouglas Gregor <dgregor@apple.com>2009-03-11 23:00:04 +0000
commit0c88030abdc2b7aad69c899b0bc981c14f21d81d (patch)
tree838ef92384a0230e203cd73d6dcd7818e2eb21fe /clang/lib/Sema/SemaDeclCXX.cpp
parentd9065c4e29fc40728a0842803d7f53d1703994e1 (diff)
downloadbcm5719-llvm-0c88030abdc2b7aad69c899b0bc981c14f21d81d.tar.gz
bcm5719-llvm-0c88030abdc2b7aad69c899b0bc981c14f21d81d.zip
Move most of the checking from ActOnCXXMemberDeclarator to other, more general routines. This is a step toward separating the checking logic from Declarators, which in turn is required for template instantiation.
llvm-svn: 66734
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp68
1 files changed, 2 insertions, 66 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 0ea501d993d..daaedae103c 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -588,72 +588,8 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D,
assert((Name || isInstField) && "No identifier for non-field ?");
- if (DS.isVirtualSpecified()) {
- if (!isFunc || DS.getStorageClassSpec() == DeclSpec::SCS_static) {
- Diag(DS.getVirtualSpecLoc(), diag::err_virtual_non_function);
- Member->setInvalidDecl();
- } else {
- cast<CXXMethodDecl>(Member)->setVirtual();
- CXXRecordDecl *CurClass = cast<CXXRecordDecl>(CurContext);
- CurClass->setAggregate(false);
- CurClass->setPOD(false);
- CurClass->setPolymorphic(true);
- }
- }
-
- // FIXME: The above definition of virtual is not sufficient. A function is
- // also virtual if it overrides an already virtual function. This is important
- // to do here because it decides the validity of a pure specifier.
-
- if (Init) {
- // C++ 9.2p4: A member-declarator can contain a constant-initializer only
- // if it declares a static member of const integral or const enumeration
- // type.
- if (VarDecl *CVD = dyn_cast<VarDecl>(Member)) {
- // ...static member of...
- CVD->setInit(Init);
- // ...const integral or const enumeration type.
- if (Context.getCanonicalType(CVD->getType()).isConstQualified() &&
- CVD->getType()->isIntegralType()) {
- // constant-initializer
- if (CheckForConstantInitializer(Init, CVD->getType()))
- Member->setInvalidDecl();
-
- } else {
- // not const integral.
- Diag(Loc, diag::err_member_initialization)
- << Name << Init->getSourceRange();
- Member->setInvalidDecl();
- }
-
- } else {
- // not static member. perhaps virtual function?
- if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member)) {
- // With declarators parsed the way they are, the parser cannot
- // distinguish between a normal initializer and a pure-specifier.
- // Thus this grotesque test.
- IntegerLiteral *IL;
- if ((IL = dyn_cast<IntegerLiteral>(Init)) && IL->getValue() == 0 &&
- Context.getCanonicalType(IL->getType()) == Context.IntTy) {
- if (MD->isVirtual())
- MD->setPure();
- else {
- Diag(Loc, diag::err_non_virtual_pure)
- << Name << Init->getSourceRange();
- Member->setInvalidDecl();
- }
- } else {
- Diag(Loc, diag::err_member_function_initialization)
- << Name << Init->getSourceRange();
- Member->setInvalidDecl();
- }
- } else {
- Diag(Loc, diag::err_member_initialization)
- << Name << Init->getSourceRange();
- Member->setInvalidDecl();
- }
- }
- }
+ if (Init)
+ AddInitializerToDecl(Member, ExprArg(*this, Init), false);
if (isInstField) {
FieldCollector->Add(cast<FieldDecl>(Member));
OpenPOWER on IntegriCloud