Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Integrate LLVM at llvm/llvm-project@ffb5bea2be9f
Updates LLVM usage to match [ffb5bea2be9f](llvm/llvm-project@ffb5bea2be9f) PiperOrigin-RevId: 623964285
- Loading branch information
1 parent
d13c842
commit d926ef3
Showing
2 changed files
with
2 additions
and
312 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,311 +1 @@ | ||
Auto generated patch. Do not edit or delete it, even if empty. | ||
diff -ruN --strip-trailing-cr a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst | ||
--- a/clang/docs/ReleaseNotes.rst | ||
+++ b/clang/docs/ReleaseNotes.rst | ||
@@ -520,8 +520,6 @@ | ||
- Fix an issue caused by not handling invalid cases when substituting into the parameter mapping of a constraint. Fixes (#GH86757). | ||
- Fixed a bug that prevented member function templates of class templates declared with a deduced return type | ||
from being explicitly specialized for a given implicit instantiation of the class template. | ||
-- Fixed a crash when ``this`` is used in a dependent class scope function template specialization | ||
- that instantiates to a static member function. | ||
|
||
- Fix crash when inheriting from a cv-qualified type. Fixes: | ||
(`#35603 <https://github.com/llvm/llvm-project/issues/35603>`_) | ||
diff -ruN --strip-trailing-cr a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h | ||
--- a/clang/include/clang/Sema/Sema.h | ||
+++ b/clang/include/clang/Sema/Sema.h | ||
@@ -5439,8 +5439,7 @@ | ||
|
||
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, | ||
bool NeedsADL, | ||
- bool AcceptInvalidDecl = false, | ||
- bool NeedUnresolved = false); | ||
+ bool AcceptInvalidDecl = false); | ||
ExprResult BuildDeclarationNameExpr( | ||
const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D, | ||
NamedDecl *FoundD = nullptr, | ||
@@ -6592,10 +6591,7 @@ | ||
SourceLocation RParenLoc); | ||
|
||
//// ActOnCXXThis - Parse 'this' pointer. | ||
- ExprResult ActOnCXXThis(SourceLocation Loc); | ||
- | ||
- /// Check whether the type of 'this' is valid in the current context. | ||
- bool CheckCXXThisType(SourceLocation Loc, QualType Type); | ||
+ ExprResult ActOnCXXThis(SourceLocation loc); | ||
|
||
/// Build a CXXThisExpr and mark it referenced in the current context. | ||
Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit); | ||
diff -ruN --strip-trailing-cr a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp | ||
--- a/clang/lib/Sema/SemaExpr.cpp | ||
+++ b/clang/lib/Sema/SemaExpr.cpp | ||
@@ -3442,11 +3442,10 @@ | ||
|
||
ExprResult Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS, | ||
LookupResult &R, bool NeedsADL, | ||
- bool AcceptInvalidDecl, | ||
- bool NeedUnresolved) { | ||
+ bool AcceptInvalidDecl) { | ||
// If this is a single, fully-resolved result and we don't need ADL, | ||
// just build an ordinary singleton decl ref. | ||
- if (!NeedUnresolved && !NeedsADL && R.isSingleResult() && | ||
+ if (!NeedsADL && R.isSingleResult() && | ||
!R.getAsSingle<FunctionTemplateDecl>() && | ||
!ShouldLookupResultBeMultiVersionOverload(R)) | ||
return BuildDeclarationNameExpr(SS, R.getLookupNameInfo(), R.getFoundDecl(), | ||
diff -ruN --strip-trailing-cr a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp | ||
--- a/clang/lib/Sema/SemaExprCXX.cpp | ||
+++ b/clang/lib/Sema/SemaExprCXX.cpp | ||
@@ -1415,42 +1415,26 @@ | ||
} | ||
|
||
ExprResult Sema::ActOnCXXThis(SourceLocation Loc) { | ||
- // C++20 [expr.prim.this]p1: | ||
- // The keyword this names a pointer to the object for which an | ||
- // implicit object member function is invoked or a non-static | ||
- // data member's initializer is evaluated. | ||
+ /// C++ 9.3.2: In the body of a non-static member function, the keyword this | ||
+ /// is a non-lvalue expression whose value is the address of the object for | ||
+ /// which the function is called. | ||
QualType ThisTy = getCurrentThisType(); | ||
|
||
- if (CheckCXXThisType(Loc, ThisTy)) | ||
- return ExprError(); | ||
+ if (ThisTy.isNull()) { | ||
+ DeclContext *DC = getFunctionLevelDeclContext(); | ||
|
||
- return BuildCXXThisExpr(Loc, ThisTy, /*IsImplicit=*/false); | ||
-} | ||
+ if (const auto *Method = dyn_cast<CXXMethodDecl>(DC); | ||
+ Method && Method->isExplicitObjectMemberFunction()) { | ||
+ return Diag(Loc, diag::err_invalid_this_use) << 1; | ||
+ } | ||
+ | ||
+ if (isLambdaCallWithExplicitObjectParameter(CurContext)) | ||
+ return Diag(Loc, diag::err_invalid_this_use) << 1; | ||
|
||
-bool Sema::CheckCXXThisType(SourceLocation Loc, QualType Type) { | ||
- if (!Type.isNull()) | ||
- return false; | ||
- | ||
- // C++20 [expr.prim.this]p3: | ||
- // If a declaration declares a member function or member function template | ||
- // of a class X, the expression this is a prvalue of type | ||
- // "pointer to cv-qualifier-seq X" wherever X is the current class between | ||
- // the optional cv-qualifier-seq and the end of the function-definition, | ||
- // member-declarator, or declarator. It shall not appear within the | ||
- // declaration of either a static member function or an explicit object | ||
- // member function of the current class (although its type and value | ||
- // category are defined within such member functions as they are within | ||
- // an implicit object member function). | ||
- DeclContext *DC = getFunctionLevelDeclContext(); | ||
- if (const auto *Method = dyn_cast<CXXMethodDecl>(DC); | ||
- Method && Method->isExplicitObjectMemberFunction()) { | ||
- Diag(Loc, diag::err_invalid_this_use) << 1; | ||
- } else if (isLambdaCallWithExplicitObjectParameter(CurContext)) { | ||
- Diag(Loc, diag::err_invalid_this_use) << 1; | ||
- } else { | ||
- Diag(Loc, diag::err_invalid_this_use) << 0; | ||
+ return Diag(Loc, diag::err_invalid_this_use) << 0; | ||
} | ||
- return true; | ||
+ | ||
+ return BuildCXXThisExpr(Loc, ThisTy, /*IsImplicit=*/false); | ||
} | ||
|
||
Expr *Sema::BuildCXXThisExpr(SourceLocation Loc, QualType Type, | ||
diff -ruN --strip-trailing-cr a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp | ||
--- a/clang/lib/Sema/SemaExprMember.cpp | ||
+++ b/clang/lib/Sema/SemaExprMember.cpp | ||
@@ -61,10 +61,6 @@ | ||
/// The reference is a contextually-permitted abstract member reference. | ||
IMA_Abstract, | ||
|
||
- /// Whether the context is static is dependent on the enclosing template (i.e. | ||
- /// in a dependent class scope explicit specialization). | ||
- IMA_Dependent, | ||
- | ||
/// The reference may be to an unresolved using declaration and the | ||
/// context is not an instance method. | ||
IMA_Unresolved_StaticOrExplicitContext, | ||
@@ -95,18 +91,10 @@ | ||
|
||
DeclContext *DC = SemaRef.getFunctionLevelDeclContext(); | ||
|
||
- bool couldInstantiateToStatic = false; | ||
- bool isStaticOrExplicitContext = SemaRef.CXXThisTypeOverride.isNull(); | ||
- | ||
- if (auto *MD = dyn_cast<CXXMethodDecl>(DC)) { | ||
- if (MD->isImplicitObjectMemberFunction()) { | ||
- isStaticOrExplicitContext = false; | ||
- // A dependent class scope function template explicit specialization | ||
- // that is neither declared 'static' nor with an explicit object | ||
- // parameter could instantiate to a static or non-static member function. | ||
- couldInstantiateToStatic = MD->getDependentSpecializationInfo(); | ||
- } | ||
- } | ||
+ bool isStaticOrExplicitContext = | ||
+ SemaRef.CXXThisTypeOverride.isNull() && | ||
+ (!isa<CXXMethodDecl>(DC) || cast<CXXMethodDecl>(DC)->isStatic() || | ||
+ cast<CXXMethodDecl>(DC)->isExplicitObjectMemberFunction()); | ||
|
||
if (R.isUnresolvableResult()) | ||
return isStaticOrExplicitContext ? IMA_Unresolved_StaticOrExplicitContext | ||
@@ -135,9 +123,6 @@ | ||
if (Classes.empty()) | ||
return IMA_Static; | ||
|
||
- if (couldInstantiateToStatic) | ||
- return IMA_Dependent; | ||
- | ||
// C++11 [expr.prim.general]p12: | ||
// An id-expression that denotes a non-static data member or non-static | ||
// member function of a class can only be used: | ||
@@ -283,30 +268,27 @@ | ||
const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, | ||
const TemplateArgumentListInfo *TemplateArgs, const Scope *S, | ||
UnresolvedLookupExpr *AsULE) { | ||
- switch (IMAKind Classification = ClassifyImplicitMemberAccess(*this, R)) { | ||
+ switch (ClassifyImplicitMemberAccess(*this, R)) { | ||
case IMA_Instance: | ||
+ return BuildImplicitMemberExpr(SS, TemplateKWLoc, R, TemplateArgs, true, S); | ||
+ | ||
case IMA_Mixed: | ||
case IMA_Mixed_Unrelated: | ||
case IMA_Unresolved: | ||
- return BuildImplicitMemberExpr( | ||
- SS, TemplateKWLoc, R, TemplateArgs, | ||
- /*IsKnownInstance=*/Classification == IMA_Instance, S); | ||
+ return BuildImplicitMemberExpr(SS, TemplateKWLoc, R, TemplateArgs, false, | ||
+ S); | ||
+ | ||
case IMA_Field_Uneval_Context: | ||
Diag(R.getNameLoc(), diag::warn_cxx98_compat_non_static_member_use) | ||
<< R.getLookupNameInfo().getName(); | ||
[[fallthrough]]; | ||
case IMA_Static: | ||
case IMA_Abstract: | ||
- case IMA_Dependent: | ||
case IMA_Mixed_StaticOrExplicitContext: | ||
case IMA_Unresolved_StaticOrExplicitContext: | ||
if (TemplateArgs || TemplateKWLoc.isValid()) | ||
- return BuildTemplateIdExpr(SS, TemplateKWLoc, R, /*RequiresADL=*/false, | ||
- TemplateArgs); | ||
- return AsULE ? AsULE | ||
- : BuildDeclarationNameExpr( | ||
- SS, R, /*NeedsADL=*/false, /*AcceptInvalidDecl=*/false, | ||
- /*NeedUnresolved=*/Classification == IMA_Dependent); | ||
+ return BuildTemplateIdExpr(SS, TemplateKWLoc, R, false, TemplateArgs); | ||
+ return AsULE ? AsULE : BuildDeclarationNameExpr(SS, R, false); | ||
|
||
case IMA_Error_StaticOrExplicitContext: | ||
case IMA_Error_Unrelated: | ||
diff -ruN --strip-trailing-cr a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | ||
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | ||
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | ||
@@ -5093,14 +5093,6 @@ | ||
EnterExpressionEvaluationContext EvalContext( | ||
*this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); | ||
|
||
- Qualifiers ThisTypeQuals; | ||
- CXXRecordDecl *ThisContext = nullptr; | ||
- if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Function)) { | ||
- ThisContext = Method->getParent(); | ||
- ThisTypeQuals = Method->getMethodQualifiers(); | ||
- } | ||
- CXXThisScopeRAII ThisScope(*this, ThisContext, ThisTypeQuals); | ||
- | ||
// Introduce a new scope where local variable instantiations will be | ||
// recorded, unless we're actually a member function within a local | ||
// class, in which case we need to merge our results with the parent | ||
diff -ruN --strip-trailing-cr a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h | ||
--- a/clang/lib/Sema/TreeTransform.h | ||
+++ b/clang/lib/Sema/TreeTransform.h | ||
@@ -3307,13 +3307,12 @@ | ||
|
||
/// Build a new C++ "this" expression. | ||
/// | ||
- /// By default, performs semantic analysis to build a new "this" expression. | ||
- /// Subclasses may override this routine to provide different behavior. | ||
+ /// By default, builds a new "this" expression without performing any | ||
+ /// semantic analysis. Subclasses may override this routine to provide | ||
+ /// different behavior. | ||
ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, | ||
QualType ThisType, | ||
bool isImplicit) { | ||
- if (getSema().CheckCXXThisType(ThisLoc, ThisType)) | ||
- return ExprError(); | ||
return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); | ||
} | ||
|
||
diff -ruN --strip-trailing-cr a/clang/test/SemaTemplate/ms-function-specialization-class-scope.cpp b/clang/test/SemaTemplate/ms-function-specialization-class-scope.cpp | ||
--- a/clang/test/SemaTemplate/ms-function-specialization-class-scope.cpp | ||
+++ b/clang/test/SemaTemplate/ms-function-specialization-class-scope.cpp | ||
@@ -1,6 +1,7 @@ | ||
-// RUN: %clang_cc1 -fms-extensions -fsyntax-only -Wno-unused-value -verify %s | ||
-// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -Wno-unused-value -verify %s | ||
+// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s | ||
+// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s | ||
|
||
+// expected-no-diagnostics | ||
class A { | ||
public: | ||
template<class U> A(U p) {} | ||
@@ -75,42 +76,3 @@ | ||
int f<0>(int); | ||
}; | ||
} | ||
- | ||
-namespace UsesThis { | ||
- template<typename T> | ||
- struct A { | ||
- int x; | ||
- | ||
- template<typename U> | ||
- static void f(); | ||
- | ||
- template<> | ||
- void f<int>() { | ||
- this->x; // expected-error {{invalid use of 'this' outside of a non-static member function}} | ||
- x; // expected-error {{invalid use of member 'x' in static member function}} | ||
- A::x; // expected-error {{invalid use of member 'x' in static member function}} | ||
- +x; // expected-error {{invalid use of member 'x' in static member function}} | ||
- +A::x; // expected-error {{invalid use of member 'x' in static member function}} | ||
- } | ||
- | ||
- template<typename U> | ||
- void g(); | ||
- | ||
- template<> | ||
- void g<int>() { | ||
- this->x; | ||
- x; | ||
- A::x; | ||
- +x; | ||
- +A::x; | ||
- } | ||
- | ||
- template<typename U> | ||
- static auto h() -> A*; | ||
- | ||
- template<> | ||
- auto h<int>() -> decltype(this); // expected-error {{'this' cannot be used in a static member function declaration}} | ||
- }; | ||
- | ||
- template struct A<int>; // expected-note 2{{in instantiation of}} | ||
-} | ||
diff -ruN --strip-trailing-cr a/llvm/lib/Support/raw_socket_stream.cpp b/llvm/lib/Support/raw_socket_stream.cpp | ||
--- a/llvm/lib/Support/raw_socket_stream.cpp | ||
+++ b/llvm/lib/Support/raw_socket_stream.cpp | ||
@@ -265,7 +265,10 @@ | ||
|
||
// Ensure ::poll returns if shutdown is called by a seperate thread | ||
char Byte = 'A'; | ||
- ::write(PipeFD[1], &Byte, 1); | ||
+ ssize_t written = ::write(PipeFD[1], &Byte, 1); | ||
+ | ||
+ // Ignore any write() error | ||
+ (void)written; | ||
} | ||
|
||
ListeningSocket::~ListeningSocket() { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters