diff options
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 68 |
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)); |

