Index: cfe/trunk/lib/Sema/SemaDeclCXX.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp @@ -143,7 +143,7 @@ if (Lambda->capture_begin() == Lambda->capture_end()) return false; - return S->Diag(Lambda->getLocStart(), + return S->Diag(Lambda->getLocStart(), diag::err_lambda_capture_default_arg); } } @@ -276,18 +276,18 @@ // Okay: add the default argument to the parameter Param->setDefaultArg(Arg); - // We have already instantiated this parameter; provide each of the + // We have already instantiated this parameter; provide each of the // instantiations with the uninstantiated default argument. UnparsedDefaultArgInstantiationsMap::iterator InstPos = UnparsedDefaultArgInstantiations.find(Param); if (InstPos != UnparsedDefaultArgInstantiations.end()) { for (unsigned I = 0, N = InstPos->second.size(); I != N; ++I) InstPos->second[I]->setUninstantiatedDefaultArg(Arg); - + // We're done tracking this parameter's instantiations. UnparsedDefaultArgInstantiations.erase(InstPos); } - + return false; } @@ -524,8 +524,8 @@ Invalid = false; } } - - // FIXME: If we knew where the '=' was, we could easily provide a fix-it + + // FIXME: If we knew where the '=' was, we could easily provide a fix-it // hint here. Alternatively, we could walk the type-source information // for NewParam to find the last source location in the type... but it // isn't worth the effort right now. This is the kind of test case that @@ -535,7 +535,7 @@ // void g(int (*fp)(int) = &f); Diag(NewParam->getLocation(), DiagDefaultParamID) << NewParam->getDefaultArgRange(); - + // Look for the function declaration where the default argument was // actually written, which may be a declaration prior to Old. for (auto Older = PrevForDefaultArgs; @@ -581,9 +581,9 @@ // or a definition for one of the following explicit specializations: // - the explicit specialization of a function template; // - the explicit specialization of a member function template; - // - the explicit specialization of a member function of a class + // - the explicit specialization of a member function of a class // template where the class template specialization to which the - // member function specialization belongs is implicitly + // member function specialization belongs is implicitly // instantiated. Diag(NewParam->getLocation(), diag::err_template_spec_default_arg) << (New->getTemplateSpecializationKind() ==TSK_ExplicitSpecialization) @@ -591,16 +591,16 @@ << NewParam->getDefaultArgRange(); } else if (New->getDeclContext()->isDependentContext()) { // C++ [dcl.fct.default]p6 (DR217): - // Default arguments for a member function of a class template shall - // be specified on the initial declaration of the member function + // Default arguments for a member function of a class template shall + // be specified on the initial declaration of the member function // within the class template. // - // Reading the tea leaves a bit in DR217 and its reference to DR205 - // leads me to the conclusion that one cannot add default function - // arguments for an out-of-line definition of a member function of a + // Reading the tea leaves a bit in DR217 and its reference to DR205 + // leads me to the conclusion that one cannot add default function + // arguments for an out-of-line definition of a member function of a // dependent type. int WhichKind = 2; - if (CXXRecordDecl *Record + if (CXXRecordDecl *Record = dyn_cast(New->getDeclContext())) { if (Record->getDescribedClassTemplate()) WhichKind = 0; @@ -609,8 +609,8 @@ else WhichKind = 2; } - - Diag(NewParam->getLocation(), + + Diag(NewParam->getLocation(), diag::err_param_default_argument_member_template_redecl) << WhichKind << NewParam->getDefaultArgRange(); @@ -2148,7 +2148,7 @@ return nullptr; } - if (EllipsisLoc.isValid() && + if (EllipsisLoc.isValid() && !TInfo->getType()->containsUnexpandedParameterPack()) { Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) << TInfo->getTypeLoc().getSourceRange(); @@ -2297,10 +2297,10 @@ GetTypeFromParser(basetype, &TInfo); if (EllipsisLoc.isInvalid() && - DiagnoseUnexpandedParameterPack(SpecifierRange.getBegin(), TInfo, + DiagnoseUnexpandedParameterPack(SpecifierRange.getBegin(), TInfo, UPPC_BaseType)) return true; - + if (CXXBaseSpecifier *BaseSpec = CheckBaseSpecifier(Class, SpecifierRange, Virtual, Access, TInfo, EllipsisLoc)) @@ -2384,7 +2384,7 @@ // Note this base's direct & indirect bases, if there could be ambiguity. if (Bases.size() > 1) NoteIndirectBases(Context, IndirectBaseTypes, NewBaseType); - + if (const RecordType *Record = NewBaseType->getAs()) { const CXXRecordDecl *RD = cast(Record->getDecl()); if (Class->isInterface() && @@ -2405,7 +2405,7 @@ // Attach the remaining base class specifiers to the derived class. Class->setBases(Bases.data(), NumGoodBases); - + for (unsigned idx = 0; idx < NumGoodBases; ++idx) { // Check whether this direct base is inaccessible due to ambiguity. QualType BaseType = Bases[idx]->getType(); @@ -2457,7 +2457,7 @@ CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl(); if (!DerivedRD) return false; - + CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl(); if (!BaseRD) return false; @@ -2471,7 +2471,7 @@ // to be able to use the inheritance relationship? if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined()) return false; - + return DerivedRD->isDerivedFrom(BaseRD); } @@ -2481,28 +2481,28 @@ CXXBasePaths &Paths) { if (!getLangOpts().CPlusPlus) return false; - + CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl(); if (!DerivedRD) return false; - + CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl(); if (!BaseRD) return false; - + if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined()) return false; - + return DerivedRD->isDerivedFrom(BaseRD, Paths); } -void Sema::BuildBasePathArray(const CXXBasePaths &Paths, +void Sema::BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePathArray) { assert(BasePathArray.empty() && "Base path array must be empty!"); assert(Paths.isRecordingPaths() && "Must record paths!"); - + const CXXBasePath &Path = Paths.front(); - + // We first go backward and check if we have a virtual base. // FIXME: It would be better if CXXBasePath had the base specifier for // the nearest virtual base. @@ -2549,27 +2549,27 @@ assert(DerivationOkay && "Can only be used with a derived-to-base conversion"); (void)DerivationOkay; - + if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType())) { if (!IgnoreAccess) { // Check that the base class can be accessed. switch (CheckBaseClassAccess(Loc, Base, Derived, Paths.front(), InaccessibleBaseID)) { - case AR_inaccessible: + case AR_inaccessible: return true; - case AR_accessible: + case AR_accessible: case AR_dependent: case AR_delayed: break; } } - + // Build a base path if necessary. if (BasePath) BuildBasePathArray(Paths, *BasePath); return false; } - + if (AmbigiousBaseConvID) { // We know that the derived-to-base conversion is ambiguous, and // we're going to produce a diagnostic. Perform the derived-to-base @@ -2634,7 +2634,7 @@ PathDisplayStr += " -> " + Element->Base->getType().getAsString(); } } - + return PathDisplayStr; } @@ -2857,6 +2857,8 @@ assert(!DS.isFriendSpecified()); bool isFunc = D.isDeclarationOfFunction(); + AttributeList *MSPropertyAttr = + getMSPropertyAttr(D.getDeclSpec().getAttributes().getList()); if (cast(CurContext)->isInterface()) { // The Microsoft extension __interface only permits public member functions @@ -2864,8 +2866,11 @@ // functions, static methods and data members. unsigned InvalidDecl; bool ShowDeclName = true; - if (!isFunc) - InvalidDecl = (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) ? 0 : 1; + if (!isFunc && + (DS.getStorageClassSpec() == DeclSpec::SCS_typedef || MSPropertyAttr)) + InvalidDecl = 0; + else if (!isFunc) + InvalidDecl = 1; else if (AS != AS_public) InvalidDecl = 2; else if (DS.getStorageClassSpec() == DeclSpec::SCS_static) @@ -3013,12 +3018,10 @@ else Diag(D.getIdentifierLoc(), diag::err_member_qualification) << Name << SS.getRange(); - + SS.clear(); } - AttributeList *MSPropertyAttr = - getMSPropertyAttr(D.getDeclSpec().getAttributes().getList()); if (MSPropertyAttr) { Member = HandleMSProperty(S, cast(CurContext), Loc, D, BitWidth, InitStyle, AS, MSPropertyAttr); @@ -3582,7 +3585,7 @@ /// \brief Find the direct and/or virtual base specifiers that /// correspond to the given base type, for use in base initialization /// within a constructor. -static bool FindBaseInitializer(Sema &SemaRef, +static bool FindBaseInitializer(Sema &SemaRef, CXXRecordDecl *ClassDecl, QualType BaseType, const CXXBaseSpecifier *&DirectBaseSpec, @@ -3766,7 +3769,7 @@ if (SS.isSet() && isDependentScopeSpecifier(SS)) { bool NotUnknownSpecialization = false; DeclContext *DC = computeDeclContext(SS, false); - if (CXXRecordDecl *Record = dyn_cast_or_null(DC)) + if (CXXRecordDecl *Record = dyn_cast_or_null(DC)) NotUnknownSpecialization = !Record->hasAnyDependentBases(); if (!NotUnknownSpecialization) { @@ -3810,7 +3813,7 @@ } else if (TypeDecl *Type = Corr.getCorrectionDeclAs()) { const CXXBaseSpecifier *DirectBaseSpec; const CXXBaseSpecifier *VirtualBaseSpec; - if (FindBaseInitializer(*this, ClassDecl, + if (FindBaseInitializer(*this, ClassDecl, Context.getTypeDeclType(Type), DirectBaseSpec, VirtualBaseSpec)) { // We have found a direct or virtual base class with a @@ -4035,7 +4038,7 @@ if (CurContext->isDependentContext()) DelegationInit = Init; - return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(), + return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(), DelegationInit.getAs(), InitRange.getEnd()); } @@ -4080,12 +4083,12 @@ // Check for direct and virtual base classes. const CXXBaseSpecifier *DirectBaseSpec = nullptr; const CXXBaseSpecifier *VirtualBaseSpec = nullptr; - if (!Dependent) { + if (!Dependent) { if (Context.hasSameUnqualifiedType(QualType(ClassDecl->getTypeForDecl(),0), BaseType)) return BuildDelegatingInitializer(BaseTInfo, Init, ClassDecl); - FindBaseInitializer(*this, ClassDecl, BaseType, DirectBaseSpec, + FindBaseInitializer(*this, ClassDecl, BaseType, DirectBaseSpec, VirtualBaseSpec); // C++ [base.class.init]p2: @@ -4205,7 +4208,7 @@ IsInheritedVirtualBase); ExprResult BaseInit; - + switch (ImplicitInitKind) { case IIK_Inherit: case IIK_Default: { @@ -4222,7 +4225,7 @@ ParmVarDecl *Param = Constructor->getParamDecl(0); QualType ParamType = Param->getType().getNonReferenceType(); - Expr *CopyCtorArg = + Expr *CopyCtorArg = DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(), SourceLocation(), Param, false, Constructor->getLocation(), ParamType, @@ -4231,8 +4234,8 @@ SemaRef.MarkDeclRefReferenced(cast(CopyCtorArg)); // Cast to the base class to avoid ambiguities. - QualType ArgTy = - SemaRef.Context.getQualifiedType(BaseSpec->getType().getUnqualifiedType(), + QualType ArgTy = + SemaRef.Context.getQualifiedType(BaseSpec->getType().getUnqualifiedType(), ParamType.getQualifiers()); if (Moving) { @@ -4258,10 +4261,10 @@ BaseInit = SemaRef.MaybeCreateExprWithCleanups(BaseInit); if (BaseInit.isInvalid()) return true; - + CXXBaseInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, - SemaRef.Context.getTrivialTypeSourceInfo(BaseSpec->getType(), + SemaRef.Context.getTrivialTypeSourceInfo(BaseSpec->getType(), SourceLocation()), BaseSpec->isVirtual(), SourceLocation(), @@ -4295,8 +4298,8 @@ // Suppress copying zero-width bitfields. if (Field->isBitField() && Field->getBitWidthValue(SemaRef.Context) == 0) return false; - - Expr *MemberExprBase = + + Expr *MemberExprBase = DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(), SourceLocation(), Param, false, Loc, ParamType, VK_LValue, nullptr); @@ -4314,7 +4317,7 @@ MemberLookup.addDecl(Indirect ? cast(Indirect) : cast(Field), AS_public); MemberLookup.resolveKind(); - ExprResult CtorArg + ExprResult CtorArg = SemaRef.BuildMemberReferenceExpr(MemberExprBase, ParamType, Loc, /*IsArrow=*/false, @@ -4343,7 +4346,7 @@ // Direct-initialize to use the copy constructor. InitializationKind InitKind = InitializationKind::CreateDirect(Loc, SourceLocation(), SourceLocation()); - + Expr *CtorArgE = CtorArg.getAs(); InitializationSequence InitSeq(SemaRef, Entity, InitKind, CtorArgE); ExprResult MemberInit = @@ -4364,16 +4367,16 @@ assert((ImplicitInitKind == IIK_Default || ImplicitInitKind == IIK_Inherit) && "Unhandled implicit init kind!"); - QualType FieldBaseElementType = + QualType FieldBaseElementType = SemaRef.Context.getBaseElementType(Field->getType()); - + if (FieldBaseElementType->isRecordType()) { InitializedEntity InitEntity = Indirect ? InitializedEntity::InitializeMember(Indirect, nullptr, /*Implicit*/ true) : InitializedEntity::InitializeMember(Field, nullptr, /*Implicit*/ true); - InitializationKind InitKind = + InitializationKind InitKind = InitializationKind::CreateDefault(Loc); InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, None); @@ -4383,10 +4386,10 @@ MemberInit = SemaRef.MaybeCreateExprWithCleanups(MemberInit); if (MemberInit.isInvalid()) return true; - + if (Indirect) CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, - Indirect, Loc, + Indirect, Loc, Loc, MemberInit.get(), Loc); @@ -4400,9 +4403,9 @@ if (!Field->getParent()->isUnion()) { if (FieldBaseElementType->isReferenceType()) { - SemaRef.Diag(Constructor->getLocation(), + SemaRef.Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor) - << (int)Constructor->isImplicit() + << (int)Constructor->isImplicit() << SemaRef.Context.getTagDeclType(Constructor->getParent()) << 0 << Field->getDeclName(); SemaRef.Diag(Field->getLocation(), diag::note_declared_at); @@ -4410,27 +4413,27 @@ } if (FieldBaseElementType.isConstQualified()) { - SemaRef.Diag(Constructor->getLocation(), + SemaRef.Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor) - << (int)Constructor->isImplicit() + << (int)Constructor->isImplicit() << SemaRef.Context.getTagDeclType(Constructor->getParent()) << 1 << Field->getDeclName(); SemaRef.Diag(Field->getLocation(), diag::note_declared_at); return true; } } - + if (FieldBaseElementType.hasNonTrivialObjCLifetime()) { // ARC and Weak: // Default-initialize Objective-C pointers to NULL. CXXMemberInit - = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, Field, - Loc, Loc, - new (SemaRef.Context) ImplicitValueInitExpr(Field->getType()), + = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, Field, + Loc, Loc, + new (SemaRef.Context) ImplicitValueInitExpr(Field->getType()), Loc); return false; } - + // Nothing to initialize. CXXMemberInit = nullptr; return false; @@ -4458,13 +4461,13 @@ else IIK = IIK_Default; } - + bool isImplicitCopyOrMove() const { switch (IIK) { case IIK_Copy: case IIK_Move: return true; - + case IIK_Default: case IIK_Inherit: return false; @@ -4531,19 +4534,19 @@ static bool isIncompleteOrZeroLengthArrayType(ASTContext &Context, QualType T) { if (T->isIncompleteArrayType()) return true; - + while (const ConstantArrayType *ArrayT = Context.getAsConstantArrayType(T)) { if (!ArrayT->getSize()) return true; - + T = ArrayT->getElementType(); } - + return false; } static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info, - FieldDecl *Field, + FieldDecl *Field, IndirectFieldDecl *Indirect = nullptr) { if (Field->isInvalidDecl()) return false; @@ -4656,7 +4659,7 @@ CXXRecordDecl *ClassDecl = Constructor->getParent()->getDefinition(); if (!ClassDecl) return true; - + bool HadError = false; for (unsigned i = 0; i < Initializers.size(); i++) { @@ -4755,34 +4758,34 @@ // initialized. if (F->isUnnamedBitfield()) continue; - + // If we're not generating the implicit copy/move constructor, then we'll // handle anonymous struct/union fields based on their individual // indirect fields. if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove()) continue; - + if (CollectFieldInitializer(*this, Info, F)) HadError = true; continue; } - + // Beyond this point, we only consider default initialization. if (Info.isImplicitCopyOrMove()) continue; - + if (auto *F = dyn_cast(Mem)) { if (F->getType()->isIncompleteArrayType()) { assert(ClassDecl->hasFlexibleArrayMember() && "Incomplete array type is not valid"); continue; } - + // Initialize each field of an anonymous struct individually. if (CollectFieldInitializer(*this, Info, F->getAnonField(), F)) HadError = true; - - continue; + + continue; } } @@ -4824,7 +4827,7 @@ CXXCtorInitializer *Member) { if (!Member->isAnyMemberInitializer()) return GetKeyForBase(Context, QualType(Member->getBaseClass(), 0)); - + return Member->getAnyMember()->getCanonicalDecl(); } @@ -4835,7 +4838,7 @@ return; // Don't check initializers order unless the warning is enabled at the - // location of at least one initializer. + // location of at least one initializer. bool ShouldCheckOrder = false; for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) { CXXCtorInitializer *Init = Inits[InitIndex]; @@ -4847,7 +4850,7 @@ } if (!ShouldCheckOrder) return; - + // Build the list of bases and members in the order that they'll // actually be initialized. The explicit initializers should be in // this same order but may be missing things. @@ -4870,10 +4873,10 @@ for (auto *Field : ClassDecl->fields()) { if (Field->isUnnamedBitfield()) continue; - + PopulateKeysForFields(Field, IdealInitKeys); } - + unsigned NumIdealInits = IdealInitKeys.size(); unsigned IdealIndex = 0; @@ -4900,7 +4903,7 @@ D << 0 << PrevInit->getAnyMember()->getDeclName(); else D << 1 << PrevInit->getTypeSourceInfo()->getType(); - + if (Init->isAnyMemberInitializer()) D << 0 << Init->getAnyMember()->getDeclName(); else @@ -4968,7 +4971,7 @@ S.Diag(En.second->getSourceLocation(), diag::note_previous_initializer) << 0 << En.second->getSourceRange(); return true; - } + } if (!En.first) { En.first = Child; En.second = Init; @@ -5002,7 +5005,7 @@ Diag(ColonLoc, diag::err_only_constructors_take_base_inits); return; } - + // Mapping for the duplicate initializers check. // For member initializers, this is keyed with a FieldDecl*. // For base initializers, this is keyed with a Type*. @@ -5064,22 +5067,22 @@ // field/base declaration. That's probably good; that said, the // user might reasonably want to know why the destructor is being // emitted, and we currently don't say. - + // Non-static data members. for (auto *Field : ClassDecl->fields()) { if (Field->isInvalidDecl()) continue; - + // Don't destroy incomplete or zero-length arrays. if (isIncompleteOrZeroLengthArrayType(Context, Field->getType())) continue; QualType FieldType = Context.getBaseElementType(Field->getType()); - + const RecordType* RT = FieldType->getAs(); if (!RT) continue; - + CXXRecordDecl *FieldClassDecl = cast(RT->getDecl()); if (FieldClassDecl->isInvalidDecl()) continue; @@ -5134,14 +5137,14 @@ << Base.getType() << Base.getSourceRange(), Context.getTypeDeclType(ClassDecl)); - + MarkFunctionReferenced(Location, Dtor); DiagnoseUseOfDecl(Dtor, Location); } if (!VisitVirtualBases) return; - + // Virtual bases. for (const auto &VBase : ClassDecl->vbases()) { // Bases are always records in a well-formed non-dependent class. @@ -5238,12 +5241,12 @@ // Keep a set of seen pure methods so we won't diagnose the same method // more than once. llvm::SmallPtrSet SeenPureMethods; - - for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(), + + for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(), MEnd = FinalOverriders.end(); - M != MEnd; + M != MEnd; ++M) { - for (OverridingMethods::iterator SO = M->second.begin(), + for (OverridingMethods::iterator SO = M->second.begin(), SOEnd = M->second.end(); SO != SOEnd; ++SO) { // C++ [class.abstract]p4: @@ -5251,7 +5254,7 @@ // pure virtual function for which the final overrider is pure // virtual. - // + // if (SO->second.size() != 1) continue; @@ -5261,8 +5264,8 @@ if (!SeenPureMethods.insert(SO->second.front().Method).second) continue; - Diag(SO->second.front().Method->getLocation(), - diag::note_pure_virtual_function) + Diag(SO->second.front().Method->getLocation(), + diag::note_pure_virtual_function) << SO->second.front().Method->getDeclName() << RD->getDeclName(); } } @@ -5742,7 +5745,7 @@ !D->defaultedCopyConstructorIsDeleted()) { if (!D->hasTrivialCopyConstructor()) return false; - HasNonDeletedCopyOrMove = true; + HasNonDeletedCopyOrMove = true; } if (S.getLangOpts().CPlusPlus11 && D->needsImplicitMoveConstructor() && @@ -5784,7 +5787,7 @@ AbstractUsageInfo Info(*this, Record); CheckAbstractClassUsage(Info, Record); } - + // If this is not an aggregate type and has no user-declared constructor, // complain about any non-static data members of reference or const scalar // type, since they will never get initializers. @@ -5803,7 +5806,7 @@ << Record->getTagKind() << Record; Complained = true; } - + Diag(F->getLocation(), diag::note_refconst_member_not_initialized) << F->getType()->isReferenceType() << F->getDeclName(); @@ -5813,12 +5816,12 @@ if (Record->getIdentifier()) { // C++ [class.mem]p13: - // If T is the name of a class, then each of the following shall have a + // If T is the name of a class, then each of the following shall have a // name different from T: // - every member of every anonymous union that is a member of class T. // // C++ [class.mem]p14: - // In addition, if class T has a user-declared constructor (12.1), every + // In addition, if class T has a user-declared constructor (12.1), every // non-static data member of class T shall have a name different from T. DeclContext::lookup_result R = Record->lookup(Record->getDeclName()); for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; @@ -7818,11 +7821,11 @@ // A constructor shall not be declared with a ref-qualifier. if (FTI.hasRefQualifier()) { Diag(FTI.getRefQualifierLoc(), diag::err_ref_qualifier_constructor) - << FTI.RefQualifierIsLValueRef + << FTI.RefQualifierIsLValueRef << FixItHint::CreateRemoval(FTI.getRefQualifierLoc()); D.setInvalidType(); } - + // Rebuild the function type "R" without any type qualifiers (in // case any of the errors above fired) and with "void" as the // return type, since constructors don't have return types. @@ -7861,8 +7864,8 @@ QualType ClassTy = Context.getTagDeclType(ClassDecl); if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) { SourceLocation ParamLoc = Constructor->getParamDecl(0)->getLocation(); - const char *ConstRef - = Constructor->getParamDecl(0)->getIdentifier() ? "const &" + const char *ConstRef + = Constructor->getParamDecl(0)->getIdentifier() ? "const &" : " const &"; Diag(ParamLoc, diag::err_constructor_byvalue_arg) << FixItHint::CreateInsertion(ParamLoc, ConstRef); @@ -7879,15 +7882,15 @@ /// on error. bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) { CXXRecordDecl *RD = Destructor->getParent(); - + if (!Destructor->getOperatorDelete() && Destructor->isVirtual()) { SourceLocation Loc; - + if (!Destructor->isImplicit()) Loc = Destructor->getLocation(); else Loc = RD->getLocation(); - + // If we have a virtual destructor, look up the deallocation function if (FunctionDecl *OperatorDelete = FindDeallocationFunctionForDestructor(Loc, RD)) { @@ -7895,7 +7898,7 @@ Destructor->setOperatorDelete(OperatorDelete); } } - + return false; } @@ -7936,7 +7939,7 @@ << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc()) << SourceRange(D.getIdentifierLoc()) << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc()); - + SC = SC_None; } if (!D.isInvalidType()) { @@ -7985,7 +7988,7 @@ << FixItHint::CreateRemoval(FTI.getRefQualifierLoc()); D.setInvalidType(); } - + // Make sure we don't have any parameters. if (FTIHasNonVoidParameters(FTI)) { Diag(D.getIdentifierLoc(), diag::err_destructor_with_params); @@ -8004,7 +8007,7 @@ // Rebuild the function type "R" without any type qualifiers or // parameters (in case any of the errors above fired) and with // "void" as the return type, since destructors don't have return - // types. + // types. if (!D.isInvalidType()) return R; @@ -8233,7 +8236,7 @@ if (FunctionTemplateDecl *ConversionTemplate = Conversion->getDescribedFunctionTemplate()) return ConversionTemplate; - + return Conversion; } @@ -8492,7 +8495,7 @@ } } else { // Anonymous namespaces. - + // Determine whether the parent already has an anonymous namespace. DeclContext *Parent = CurContext->getRedeclContext(); if (TranslationUnitDecl *TU = dyn_cast(Parent)) { @@ -8506,12 +8509,12 @@ DiagnoseNamespaceInlineMismatch(*this, NamespaceLoc, NamespaceLoc, II, &IsInline, PrevNS); } - + NamespaceDecl *Namespc = NamespaceDecl::Create(Context, CurContext, IsInline, StartLoc, Loc, II, PrevNS); if (IsInvalid) Namespc->setInvalidDecl(); - + ProcessDeclAttributeList(DeclRegionScope, Namespc, AttrList); AddPragmaAttributes(DeclRegionScope, Namespc); @@ -8523,7 +8526,7 @@ StdNamespace = Namespc; if (AddToKnown) KnownNamespaces[Namespc] = false; - + if (II) { PushOnScopeChains(Namespc, DeclRegionScope); } else { @@ -8624,12 +8627,12 @@ return StdExperimentalNamespaceCache; } -/// \brief Retrieve the special "std" namespace, which may require us to +/// \brief Retrieve the special "std" namespace, which may require us to /// implicitly define the namespace. NamespaceDecl *Sema::getOrCreateStdNamespace() { if (!StdNamespace) { // The "std" namespace has not yet been defined, so build one implicitly. - StdNamespace = NamespaceDecl::Create(Context, + StdNamespace = NamespaceDecl::Create(Context, Context.getTranslationUnitDecl(), /*Inline=*/false, SourceLocation(), SourceLocation(), @@ -8842,7 +8845,7 @@ NestedNameSpecifier *Qualifier = nullptr; if (SS.isSet()) Qualifier = SS.getScopeRep(); - + // Lookup namespace name. LookupResult R(*this, NamespcName, IdentLoc, LookupNamespaceName); LookupParsedName(R, S, &SS); @@ -8851,18 +8854,18 @@ if (R.empty()) { R.clear(); - // Allow "using namespace std;" or "using namespace ::std;" even if + // Allow "using namespace std;" or "using namespace ::std;" even if // "std" hasn't been defined yet, for GCC compatibility. if ((!Qualifier || Qualifier->getKind() == NestedNameSpecifier::Global) && NamespcName->isStr("std")) { Diag(IdentLoc, diag::ext_using_undefined_std); R.addDecl(getOrCreateStdNamespace()); R.resolveKind(); - } + } // Otherwise, attempt typo correction. else TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, NamespcName); } - + if (!R.empty()) { NamedDecl *Named = R.getRepresentativeDecl(); NamespaceDecl *NS = R.getAsSingle(); @@ -8943,7 +8946,7 @@ case UnqualifiedId::IK_LiteralOperatorId: case UnqualifiedId::IK_ConversionFunctionId: break; - + case UnqualifiedId::IK_ConstructorName: case UnqualifiedId::IK_ConstructorTemplateId: // C++11 inheriting constructors. @@ -9086,7 +9089,7 @@ // If the target happens to be one of the previous declarations, we // don't have a conflict. - // + // // FIXME: but we might be increasing its access, in which case we // should redeclare it. NamedDecl *NonTag = nullptr, *Tag = nullptr; @@ -9461,7 +9464,7 @@ IdentLoc, NameInfo.getName(), EllipsisLoc); } else { - D = UnresolvedUsingValueDecl::Create(Context, CurContext, UsingLoc, + D = UnresolvedUsingValueDecl::Create(Context, CurContext, UsingLoc, QualifierLoc, NameInfo, EllipsisLoc); } D->setAccess(AS); @@ -9974,7 +9977,7 @@ if (DiagnoseUnexpandedParameterPack(Name.StartLocation, TInfo, UPPC_DeclarationType)) { Invalid = true; - TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy, + TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy, TInfo->getTypeLoc().getBeginLoc()); } @@ -10137,7 +10140,7 @@ /*AllowInlineNamespace*/false); // Find the previous declaration and check that we can redeclare it. - NamespaceAliasDecl *Prev = nullptr; + NamespaceAliasDecl *Prev = nullptr; if (PrevR.isSingleResult()) { NamedDecl *PrevDecl = PrevR.getRepresentativeDecl(); if (NamespaceAliasDecl *AD = dyn_cast(PrevDecl)) { @@ -10258,7 +10261,7 @@ CXXRecordDecl *ClassDecl = MD->getParent(); // C++ [except.spec]p14: - // An implicitly declared special member function (Clause 12) shall have an + // An implicitly declared special member function (Clause 12) shall have an // exception-specification. [...] SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, Loc); if (ClassDecl->isInvalidDecl()) @@ -11123,7 +11126,7 @@ // // for (__SIZE_TYPE__ i0 = 0; i0 != array-size; ++i0) // - // that will copy each of the array elements. + // that will copy each of the array elements. QualType SizeType = S.Context.getSizeType(); // Create the iteration variable. @@ -11335,7 +11338,7 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *CopyAssignOperator) { - assert((CopyAssignOperator->isDefaulted() && + assert((CopyAssignOperator->isDefaulted() && CopyAssignOperator->isOverloadedOperator() && CopyAssignOperator->getOverloadedOperator() == OO_Equal && !CopyAssignOperator->doesThisDeclarationHaveABody() && @@ -11369,15 +11372,15 @@ // C++0x [class.copy]p30: // The implicitly-defined or explicitly-defaulted copy assignment operator - // for a non-union class X performs memberwise copy assignment of its - // subobjects. The direct base classes of X are assigned first, in the - // order of their declaration in the base-specifier-list, and then the - // immediate non-static data members of X are assigned, in the order in + // for a non-union class X performs memberwise copy assignment of its + // subobjects. The direct base classes of X are assigned first, in the + // order of their declaration in the base-specifier-list, and then the + // immediate non-static data members of X are assigned, in the order in // which they were declared in the class definition. - + // The statements that form the synthesized function body. SmallVector Statements; - + // The parameter for the "other" object, which we are copying from. ParmVarDecl *Other = CopyAssignOperator->getParamDecl(0); Qualifiers OtherQuals = Other->getType().getQualifiers(); @@ -11387,7 +11390,7 @@ OtherRefType = OtherRef->getPointeeType(); OtherQuals = OtherRefType.getQualifiers(); } - + // Our location for everything implicitly-generated. SourceLocation Loc = CopyAssignOperator->getLocEnd().isValid() ? CopyAssignOperator->getLocEnd() @@ -11398,7 +11401,7 @@ // Builds the "this" pointer. ThisBuilder This; - + // Assign base classes. bool Invalid = false; for (auto &Base : ClassDecl->bases()) { @@ -11434,11 +11437,11 @@ CopyAssignOperator->setInvalidDecl(); return; } - + // Success! Record the copy. Statements.push_back(Copy.getAs()); } - + // Assign non-static members. for (auto *Field : ClassDecl->fields()) { // FIXME: We should form some kind of AST representation for the implied @@ -11459,28 +11462,28 @@ Invalid = true; continue; } - + // Check for members of const-qualified, non-class type. QualType BaseType = Context.getBaseElementType(Field->getType()); if (!BaseType->getAs() && BaseType.isConstQualified()) { Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName(); Diag(Field->getLocation(), diag::note_declared_at); - Invalid = true; + Invalid = true; continue; } // Suppress assigning zero-width bitfields. if (Field->isBitField() && Field->getBitWidthValue(Context) == 0) continue; - + QualType FieldType = Field->getType().getNonReferenceType(); if (FieldType->isIncompleteArrayType()) { - assert(ClassDecl->hasFlexibleArrayMember() && + assert(ClassDecl->hasFlexibleArrayMember() && "Incomplete array type is not valid"); continue; } - + // Build references to the field in the object we're copying from and to. CXXScopeSpec SS; // Intentionally empty LookupResult MemberLookup(*this, Field->getDeclName(), Loc, @@ -11501,7 +11504,7 @@ CopyAssignOperator->setInvalidDecl(); return; } - + // Success! Record the copy. Statements.push_back(Copy.getAs()); } @@ -11509,7 +11512,7 @@ if (!Invalid) { // Add a "return *this;" ExprResult ThisObj = CreateBuiltinUnaryOp(Loc, UO_Deref, This.build(*this, Loc)); - + StmtResult Return = BuildReturnStmt(Loc, ThisObj.get()); if (Return.isInvalid()) Invalid = true; @@ -11697,7 +11700,7 @@ void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MoveAssignOperator) { - assert((MoveAssignOperator->isDefaulted() && + assert((MoveAssignOperator->isDefaulted() && MoveAssignOperator->isOverloadedOperator() && MoveAssignOperator->getOverloadedOperator() == OO_Equal && !MoveAssignOperator->doesThisDeclarationHaveABody() && @@ -11711,7 +11714,7 @@ MoveAssignOperator->setInvalidDecl(); return; } - + // C++0x [class.copy]p28: // The implicitly-defined or move assignment operator for a non-union class // X performs memberwise move assignment of its subobjects. The direct base @@ -11833,21 +11836,21 @@ Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName(); Diag(Field->getLocation(), diag::note_declared_at); - Invalid = true; + Invalid = true; continue; } // Suppress assigning zero-width bitfields. if (Field->isBitField() && Field->getBitWidthValue(Context) == 0) continue; - + QualType FieldType = Field->getType().getNonReferenceType(); if (FieldType->isIncompleteArrayType()) { - assert(ClassDecl->hasFlexibleArrayMember() && + assert(ClassDecl->hasFlexibleArrayMember() && "Incomplete array type is not valid"); continue; } - + // Build references to the field in the object we're copying from and to. LookupResult MemberLookup(*this, Field->getDeclName(), Loc, LookupMemberName); @@ -12161,26 +12164,26 @@ SourceLocation CurrentLocation, CXXConversionDecl *Conv) { SynthesizedFunctionScope Scope(*this, Conv); - + CXXRecordDecl *Lambda = Conv->getParent(); CXXMethodDecl *CallOp = Lambda->getLambdaCallOperator(); // If we are defining a specialization of a conversion to function-ptr // cache the deduced template arguments for this specialization // so that we can use them to retrieve the corresponding call-operator - // and static-invoker. + // and static-invoker. const TemplateArgumentList *DeducedTemplateArgs = nullptr; // Retrieve the corresponding call-operator specialization. if (Lambda->isGenericLambda()) { assert(Conv->isFunctionTemplateSpecialization()); - FunctionTemplateDecl *CallOpTemplate = + FunctionTemplateDecl *CallOpTemplate = CallOp->getDescribedFunctionTemplate(); DeducedTemplateArgs = Conv->getTemplateSpecializationArgs(); void *InsertPos = nullptr; FunctionDecl *CallOpSpec = CallOpTemplate->findSpecialization( DeducedTemplateArgs->asArray(), InsertPos); - assert(CallOpSpec && + assert(CallOpSpec && "Conversion operator must have a corresponding call operator"); CallOp = cast(CallOpSpec); } @@ -12196,15 +12199,15 @@ CXXMethodDecl *Invoker = Lambda->getLambdaStaticInvoker(); // ... and get the corresponding specialization for a generic lambda. if (Lambda->isGenericLambda()) { - assert(DeducedTemplateArgs && + assert(DeducedTemplateArgs && "Must have deduced template arguments from Conversion Operator"); - FunctionTemplateDecl *InvokeTemplate = + FunctionTemplateDecl *InvokeTemplate = Invoker->getDescribedFunctionTemplate(); void *InsertPos = nullptr; FunctionDecl *InvokeSpec = InvokeTemplate->findSpecialization( DeducedTemplateArgs->asArray(), InsertPos); - assert(InvokeSpec && + assert(InvokeSpec && "Must have a corresponding static invoker specialization"); Invoker = cast(InvokeSpec); } @@ -12219,13 +12222,13 @@ Conv->markUsed(Context); Conv->setReferenced(); - + // Fill in the __invoke function with a dummy implementation. IR generation // will fill in the actual details. Invoker->markUsed(Context); Invoker->setReferenced(); Invoker->setBody(new (Context) CompoundStmt(Conv->getLocation())); - + if (ASTMutationListener *L = getASTMutationListener()) { L->CompletedImplicitDefinition(Conv); L->CompletedImplicitDefinition(Invoker); @@ -12236,16 +12239,16 @@ void Sema::DefineImplicitLambdaToBlockPointerConversion( SourceLocation CurrentLocation, - CXXConversionDecl *Conv) + CXXConversionDecl *Conv) { assert(!Conv->getParent()->isGenericLambda()); SynthesizedFunctionScope Scope(*this, Conv); - + // Copy-initialize the lambda object as needed to capture it. Expr *This = ActOnCXXThis(CurrentLocation).get(); Expr *DerefThis =CreateBuiltinUnaryOp(CurrentLocation, UO_Deref, This).get(); - + ExprResult BuildBlock = BuildBlockForLambdaConversion(CurrentLocation, Conv->getLocation(), Conv, DerefThis); @@ -12280,29 +12283,29 @@ Conv->getLocation(), Conv->getLocation())); Conv->markUsed(Context); - + // We're done; notify the mutation listener, if any. if (ASTMutationListener *L = getASTMutationListener()) { L->CompletedImplicitDefinition(Conv); } } -/// \brief Determine whether the given list arguments contains exactly one +/// \brief Determine whether the given list arguments contains exactly one /// "real" (non-default) argument. static bool hasOneRealArgument(MultiExprArg Args) { switch (Args.size()) { case 0: return false; - + default: if (!Args[1]->isDefaultArgument()) return false; - + // fall through case 1: return !Args[0]->isDefaultArgument(); } - + return false; } @@ -12359,7 +12362,7 @@ if (auto *Shadow = dyn_cast(FoundDecl)) { Constructor = findInheritingConstructor(ConstructLoc, Constructor, Shadow); if (DiagnoseUseOfDecl(Constructor, ConstructLoc)) - return ExprError(); + return ExprError(); } return BuildCXXConstructExpr( @@ -12503,7 +12506,7 @@ /// to form a proper call to this constructor. /// /// \returns true if an error occurred, false otherwise. -bool +bool Sema::CompleteConstructorCall(CXXConstructorDecl *Constructor, MultiExprArg ArgsPtr, SourceLocation Loc, @@ -12514,7 +12517,7 @@ unsigned NumArgs = ArgsPtr.size(); Expr **Args = ArgsPtr.data(); - const FunctionProtoType *Proto + const FunctionProtoType *Proto = Constructor->getType()->getAs(); assert(Proto && "Constructor without a prototype?"); unsigned NumParams = Proto->getNumParams(); @@ -12525,7 +12528,7 @@ else ConvertedArgs.reserve(NumArgs); - VariadicCallType CallType = + VariadicCallType CallType = Proto->isVariadic() ? VariadicConstructor : VariadicDoesNotApply; SmallVector AllArgs; bool Invalid = GatherArgumentsForCall(Loc, Constructor, @@ -12546,22 +12549,22 @@ } static inline bool -CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, +CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, const FunctionDecl *FnDecl) { const DeclContext *DC = FnDecl->getDeclContext()->getRedeclContext(); if (isa(DC)) { - return SemaRef.Diag(FnDecl->getLocation(), + return SemaRef.Diag(FnDecl->getLocation(), diag::err_operator_new_delete_declared_in_namespace) << FnDecl->getDeclName(); } - - if (isa(DC) && + + if (isa(DC) && FnDecl->getStorageClass() == SC_Static) { return SemaRef.Diag(FnDecl->getLocation(), diag::err_operator_new_delete_declared_static) << FnDecl->getDeclName(); } - + return false; } @@ -12583,21 +12586,21 @@ // Check that the result type is what we expect. if (SemaRef.Context.getCanonicalType(ResultType) != ExpectedResultType) return SemaRef.Diag(FnDecl->getLocation(), - diag::err_operator_new_delete_invalid_result_type) + diag::err_operator_new_delete_invalid_result_type) << FnDecl->getDeclName() << ExpectedResultType; - + // A function template must have at least 2 parameters. if (FnDecl->getDescribedFunctionTemplate() && FnDecl->getNumParams() < 2) return SemaRef.Diag(FnDecl->getLocation(), diag::err_operator_new_delete_template_too_few_parameters) << FnDecl->getDeclName(); - + // The function decl must have at least 1 parameter. if (FnDecl->getNumParams() == 0) return SemaRef.Diag(FnDecl->getLocation(), diag::err_operator_new_delete_too_few_parameters) << FnDecl->getDeclName(); - + // Check the first parameter type is not dependent. QualType FirstParamType = FnDecl->getParamDecl(0)->getType(); if (FirstParamType->isDependentType()) @@ -12605,11 +12608,11 @@ << FnDecl->getDeclName() << ExpectedFirstParamType; // Check that the first parameter type is what we expect. - if (SemaRef.Context.getCanonicalType(FirstParamType).getUnqualifiedType() != + if (SemaRef.Context.getCanonicalType(FirstParamType).getUnqualifiedType() != ExpectedFirstParamType) return SemaRef.Diag(FnDecl->getLocation(), InvalidParamTypeDiag) << FnDecl->getDeclName() << ExpectedFirstParamType; - + return false; } @@ -12617,18 +12620,18 @@ CheckOperatorNewDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) { // C++ [basic.stc.dynamic.allocation]p1: // A program is ill-formed if an allocation function is declared in a - // namespace scope other than global scope or declared static in global + // namespace scope other than global scope or declared static in global // scope. if (CheckOperatorNewDeleteDeclarationScope(SemaRef, FnDecl)) return true; - CanQualType SizeTy = + CanQualType SizeTy = SemaRef.Context.getCanonicalType(SemaRef.Context.getSizeType()); // C++ [basic.stc.dynamic.allocation]p1: - // The return type shall be void*. The first parameter shall have type + // The return type shall be void*. The first parameter shall have type // std::size_t. - if (CheckOperatorNewDeleteTypes(SemaRef, FnDecl, SemaRef.Context.VoidPtrTy, + if (CheckOperatorNewDeleteTypes(SemaRef, FnDecl, SemaRef.Context.VoidPtrTy, SizeTy, diag::err_operator_new_dependent_param_type, diag::err_operator_new_param_type)) @@ -12648,15 +12651,15 @@ CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) { // C++ [basic.stc.dynamic.deallocation]p1: // A program is ill-formed if deallocation functions are declared in a - // namespace scope other than global scope or declared static in global + // namespace scope other than global scope or declared static in global // scope. if (CheckOperatorNewDeleteDeclarationScope(SemaRef, FnDecl)) return true; // C++ [basic.stc.dynamic.deallocation]p2: - // Each deallocation function shall return void and its first parameter + // Each deallocation function shall return void and its first parameter // shall be void*. - if (CheckOperatorNewDeleteTypes(SemaRef, FnDecl, SemaRef.Context.VoidTy, + if (CheckOperatorNewDeleteTypes(SemaRef, FnDecl, SemaRef.Context.VoidTy, SemaRef.Context.VoidPtrTy, diag::err_operator_delete_dependent_param_type, diag::err_operator_delete_param_type)) @@ -12682,7 +12685,7 @@ // explicitly stated in 3.7.3. if (Op == OO_Delete || Op == OO_Array_Delete) return CheckOperatorDeleteDeclaration(*this, FnDecl); - + if (Op == OO_New || Op == OO_Array_New) return CheckOperatorNewDeclaration(*this, FnDecl); @@ -13085,7 +13088,7 @@ IdentifierInfo *Name) { bool Invalid = false; QualType ExDeclType = TInfo->getType(); - + // Arrays and functions decay. if (ExDeclType->isArrayType()) ExDeclType = Context.getArrayDecayedType(ExDeclType); @@ -13149,7 +13152,7 @@ VarDecl *ExDecl = VarDecl::Create(Context, CurContext, StartLoc, Loc, Name, ExDeclType, TInfo, SC_None); ExDecl->setExceptionVariable(true); - + // In ARC, infer 'retaining' for variables of retainable type. if (getLangOpts().ObjCAutoRefCount && inferObjCARCLifetime(ExDecl)) Invalid = true; @@ -13190,13 +13193,13 @@ Expr *init = MaybeCreateExprWithCleanups(construct); ExDecl->setInit(init); } - + // And make sure it's destructable. FinalizeVarWithDestructor(ExDecl, recordType); } } } - + if (Invalid) ExDecl->setInvalidDecl(); @@ -13212,7 +13215,7 @@ // Check for unexpanded parameter packs. if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo, UPPC_ExceptionType)) { - TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy, + TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy, D.getIdentifierLoc()); Invalid = true; } @@ -13338,10 +13341,10 @@ SourceLocation FriendLoc, TypeSourceInfo *TSInfo) { assert(TSInfo && "NULL TypeSourceInfo for friend type declaration"); - + QualType T = TSInfo->getType(); SourceRange TypeRange = TSInfo->getTypeLoc().getLocalSourceRange(); - + // C++03 [class.friend]p2: // An elaborated-type-specifier shall be used in a friend declaration // for a class.* @@ -13385,7 +13388,7 @@ << T << TypeRange; } - + // C++11 [class.friend]p3: // A friend declaration that does not declare a function shall have one // of the following forms: @@ -13498,9 +13501,9 @@ CurContext->addDecl(Friend); return Friend; } - + assert(SS.isNotEmpty() && "valid templated tag with no SS and no direct?"); - + // Handle the case of a templated-scope friend class. e.g. @@ -13580,7 +13583,7 @@ << DS.getSourceRange(); return nullptr; } - + // C++98 [class.friend]p1: A friend of a class is a function // or class that is not a member of the class . . . // This is fixed in DR77, which just barely didn't make the C++03 @@ -13600,7 +13603,7 @@ DS.getFriendSpecLoc()); else D = CheckFriendTypeDecl(Loc, DS.getFriendSpecLoc(), TSI); - + if (!D) return nullptr; @@ -13800,15 +13803,15 @@ getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_friend_is_member : diag::err_friend_is_member); - + if (D.isFunctionDefinition()) { // C++ [class.friend]p6: - // A function can be defined in a friend declaration of a class if and + // A function can be defined in a friend declaration of a class if and // only if the class is a non-local class (9.8), the function name is // unqualified, and the function has namespace scope. SemaDiagnosticBuilder DB = Diag(SS.getRange().getBegin(), diag::err_qualified_friend_def); - + DB << SS.getScopeRep(); if (DC->isFileContext()) DB << FixItHint::CreateRemoval(SS.getRange()); @@ -13823,13 +13826,13 @@ } else { if (D.isFunctionDefinition()) { // C++ [class.friend]p6: - // A function can be defined in a friend declaration of a class if and + // A function can be defined in a friend declaration of a class if and // only if the class is a non-local class (9.8), the function name is // unqualified, and the function has namespace scope. Diag(SS.getRange().getBegin(), diag::err_qualified_friend_def) << SS.getScopeRep(); } - + DC = CurContext; assert(isa(DC) && "friend declaration not in class?"); } @@ -13865,7 +13868,7 @@ } // FIXME: This is an egregious hack to cope with cases where the scope stack - // does not contain the declaration context, i.e., in an out-of-line + // does not contain the declaration context, i.e., in an out-of-line // definition of a class. Scope FakeDCScope(S, Scope::DeclScope, Diags); if (!DCScope) { @@ -14316,7 +14319,7 @@ void Sema::LoadExternalVTableUses() { if (!ExternalSource) return; - + SmallVector VTables; ExternalSource->ReadUsedVTables(VTables); SmallVector NewUses; @@ -14329,11 +14332,11 @@ Pos->second = true; continue; } - + VTablesUsed[VTables[I].Record] = VTables[I].DefinitionRequired; NewUses.push_back(VTableUse(VTables[I].Record, VTables[I].Location)); } - + VTableUses.insert(VTableUses.begin(), NewUses.begin(), NewUses.end()); } @@ -14540,17 +14543,17 @@ FieldDecl *Field = ivars[i]; if (Field->isInvalidDecl()) continue; - + CXXCtorInitializer *Member; InitializedEntity InitEntity = InitializedEntity::InitializeMember(Field); - InitializationKind InitKind = + InitializationKind InitKind = InitializationKind::CreateDefault(ObjCImplementation->getLocation()); InitializationSequence InitSeq(*this, InitEntity, InitKind, None); ExprResult MemberInit = InitSeq.Perform(*this, InitEntity, InitKind, None); MemberInit = MaybeCreateExprWithCleanups(MemberInit); - // Note, MemberInit could actually come back empty if no initialization + // Note, MemberInit could actually come back empty if no initialization // is required (e.g., because it would call a trivial default constructor) if (!MemberInit.get() || MemberInit.isInvalid()) continue; @@ -14561,7 +14564,7 @@ MemberInit.getAs(), SourceLocation()); AllToInit.push_back(Member); - + // Be sure that the destructor is accessible and is marked as referenced. if (const RecordType *RecordTy = Context.getBaseElementType(Field->getType()) @@ -14573,9 +14576,9 @@ PDiag(diag::err_access_dtor_ivar) << Context.getBaseElementType(Field->getType())); } - } + } } - ObjCImplementation->setIvarInitializers(Context, + ObjCImplementation->setIvarInitializers(Context, AllToInit.data(), AllToInit.size()); } } @@ -14643,7 +14646,7 @@ DelegatingCycleHelper(Target, Valid, Invalid, Current, S); } } - + void Sema::CheckDelegatingCtorCycles() { llvm::SmallSet Valid, Invalid, Current; @@ -14664,10 +14667,10 @@ /// \brief AST visitor that finds references to the 'this' expression. class FindCXXThisExpr : public RecursiveASTVisitor { Sema &S; - + public: explicit FindCXXThisExpr(Sema &S) : S(S) { } - + bool VisitCXXThisExpr(CXXThisExpr *E) { S.Diag(E->getLocation(), diag::err_this_static_member_func) << E->isImplicit(); @@ -14680,22 +14683,22 @@ TypeSourceInfo *TSInfo = Method->getTypeSourceInfo(); if (!TSInfo) return false; - + TypeLoc TL = TSInfo->getTypeLoc(); FunctionProtoTypeLoc ProtoTL = TL.getAs(); if (!ProtoTL) return false; - + // C++11 [expr.prim.general]p3: - // [The expression this] shall not appear before the optional - // cv-qualifier-seq and it shall not appear within the declaration of a + // [The expression this] shall not appear before the optional + // cv-qualifier-seq and it shall not appear within the declaration of a // static member function (although its type and value category are defined // within a static member function as they are within a non-static member // function). [ Note: this is because declaration matching does not occur // until the complete declarator is known. - end note ] const FunctionProtoType *Proto = ProtoTL.getTypePtr(); FindCXXThisExpr Finder(*this); - + // If the return type came after the cv-qualifier-seq, check it now. if (Proto->hasTrailingReturn() && !Finder.TraverseTypeLoc(ProtoTL.getReturnLoc())) @@ -14704,7 +14707,7 @@ // Check the exception specification. if (checkThisInStaticMemberFunctionExceptionSpec(Method)) return true; - + return checkThisInStaticMemberFunctionAttributes(Method); } @@ -14712,12 +14715,12 @@ TypeSourceInfo *TSInfo = Method->getTypeSourceInfo(); if (!TSInfo) return false; - + TypeLoc TL = TSInfo->getTypeLoc(); FunctionProtoTypeLoc ProtoTL = TL.getAs(); if (!ProtoTL) return false; - + const FunctionProtoType *Proto = ProtoTL.getTypePtr(); FindCXXThisExpr Finder(*this); @@ -14730,12 +14733,12 @@ case EST_MSAny: case EST_None: break; - + case EST_ComputedNoexcept: if (!Finder.TraverseStmt(Proto->getNoexceptExpr())) return true; LLVM_FALLTHROUGH; - + case EST_Dynamic: for (const auto &E : Proto->exceptions()) { if (!Finder.TraverseType(E)) @@ -14784,13 +14787,13 @@ if (Arg && !Finder.TraverseStmt(Arg)) return true; - + for (unsigned I = 0, N = Args.size(); I != N; ++I) { if (!Finder.TraverseStmt(Args[I])) return true; } } - + return false; } Index: cfe/trunk/test/SemaCXX/ms-interface.cpp =================================================================== --- cfe/trunk/test/SemaCXX/ms-interface.cpp +++ cfe/trunk/test/SemaCXX/ms-interface.cpp @@ -77,3 +77,32 @@ class C2 : I6 { }; + + +// MSVC makes a special case in that an interface is allowed to have a data +// member if it is a property. +__interface HasProp { + __declspec(property(get = Get, put = Put)) int data; + int Get(void); + void Put(int); +}; + +struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) + IUnknown { + void foo(); + __declspec(property(get = Get, put = Put), deprecated) int data; + int Get(void); + void Put(int); +}; + +struct IFaceStruct : IUnknown { + __declspec(property(get = Get2, put = Put2), deprecated) int data2; + int Get2(void); + void Put2(int); +}; + +__interface IFaceInheritsStruct : IFaceStruct {}; +static_assert(!__is_interface_class(HasProp), "oops"); +static_assert(!__is_interface_class(IUnknown), "oops"); +static_assert(!__is_interface_class(IFaceStruct), "oops"); +static_assert(!__is_interface_class(IFaceInheritsStruct), "oops");