diff options
Diffstat (limited to 'lib/Sema/SemaExprMember.cpp')
-rw-r--r-- | lib/Sema/SemaExprMember.cpp | 65 |
1 files changed, 12 insertions, 53 deletions
diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index c3d0e2db76b6..03ddcc0a3eca 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -384,7 +384,9 @@ CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK, } } - if (!HalvingSwizzle) { + // OpenCL mode requires swizzle length to be in accordance with accepted + // sizes. Clang however supports arbitrary lengths for other languages. + if (S.getLangOpts().OpenCL && !HalvingSwizzle) { unsigned SwizzleLength = CompName->getLength(); if (HexSwizzle) @@ -693,8 +695,7 @@ static bool LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, Sema::RedeclarationKind Redecl; }; QueryState Q = {R.getSema(), R.getLookupNameInfo(), R.getLookupKind(), - R.isForRedeclaration() ? Sema::ForRedeclaration - : Sema::NotForRedeclaration}; + R.redeclarationKind()}; TE = SemaRef.CorrectTypoDelayed( R.getLookupNameInfo(), R.getLookupKind(), nullptr, &SS, llvm::make_unique<RecordMemberExprValidatorCCC>(RTy), @@ -1001,53 +1002,7 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, BaseExpr = Converted.get(); } - LambdaScopeInfo *const CurLSI = getCurLambda(); - // If this is an implicit member reference and the overloaded - // name refers to both static and non-static member functions - // (i.e. BaseExpr is null) and if we are currently processing a lambda, - // check if we should/can capture 'this'... - // Keep this example in mind: - // struct X { - // void f(int) { } - // static void f(double) { } - // - // int g() { - // auto L = [=](auto a) { - // return [](int i) { - // return [=](auto b) { - // f(b); - // //f(decltype(a){}); - // }; - // }; - // }; - // auto M = L(0.0); - // auto N = M(3); - // N(5.32); // OK, must not error. - // return 0; - // } - // }; - // - if (!BaseExpr && CurLSI) { - SourceLocation Loc = R.getNameLoc(); - if (SS.getRange().isValid()) - Loc = SS.getRange().getBegin(); - DeclContext *EnclosingFunctionCtx = CurContext->getParent()->getParent(); - // If the enclosing function is not dependent, then this lambda is - // capture ready, so if we can capture this, do so. - if (!EnclosingFunctionCtx->isDependentContext()) { - // If the current lambda and all enclosing lambdas can capture 'this' - - // then go ahead and capture 'this' (since our unresolved overload set - // contains both static and non-static member functions). - if (!CheckCXXThisCapture(Loc, /*Explcit*/false, /*Diagnose*/false)) - CheckCXXThisCapture(Loc); - } else if (CurContext->isDependentContext()) { - // ... since this is an implicit member reference, that might potentially - // involve a 'this' capture, mark 'this' for potential capture in - // enclosing lambdas. - if (CurLSI->ImpCaptureStyle != CurLSI->ImpCap_None) - CurLSI->addPotentialThisCapture(Loc); - } - } + const DeclarationNameInfo &MemberNameInfo = R.getLookupNameInfo(); DeclarationName MemberName = MemberNameInfo.getName(); SourceLocation MemberLoc = MemberNameInfo.getLoc(); @@ -1836,7 +1791,9 @@ Sema::BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, MemberType = Context.getQualifiedType(MemberType, Combined); } - UnusedPrivateFields.remove(Field); + auto *CurMethod = dyn_cast<CXXMethodDecl>(CurContext); + if (!(CurMethod && CurMethod->isDefaulted())) + UnusedPrivateFields.remove(Field); ExprResult Base = PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(), FoundDecl, Field); @@ -1848,8 +1805,10 @@ Sema::BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, if (getLangOpts().OpenMP && IsArrow && !CurContext->isDependentContext() && isa<CXXThisExpr>(Base.get()->IgnoreParenImpCasts())) { - if (auto *PrivateCopy = IsOpenMPCapturedDecl(Field)) - return getOpenMPCapturedExpr(PrivateCopy, VK, OK, OpLoc); + if (auto *PrivateCopy = IsOpenMPCapturedDecl(Field)) { + return getOpenMPCapturedExpr(PrivateCopy, VK, OK, + MemberNameInfo.getLoc()); + } } return BuildMemberExpr(*this, Context, Base.get(), IsArrow, OpLoc, SS, |