[llvm-branch-commits] [clang] 9231045 - Make LLVM build in C++20 mode
Author: Barry Revzin Date: 2020-12-17T10:44:10Z New Revision: 92310454bf0f1f9686f38afd11756c7d046495c9 URL: https://github.com/llvm/llvm-project/commit/92310454bf0f1f9686f38afd11756c7d046495c9 DIFF: https://github.com/llvm/llvm-project/commit/92310454bf0f1f9686f38afd11756c7d046495c9.diff LOG: Make LLVM build in C++20 mode Part of the <=> changes in C++20 make certain patterns of writing equality operators ambiguous with themselves (sorry!). This patch goes through and adjusts all the comparison operators such that they should work in both C++17 and C++20 modes. It also makes two other small C++20-specific changes (adding a constructor to a type that cases to be an aggregate, and adding casts from u8 literals which no longer have type const char*). There were four categories of errors that this review fixes. Here are canonical examples of them, ordered from most to least common: // 1) Missing const namespace missing_const { struct A { #ifndef FIXED bool operator==(A const&); #else bool operator==(A const&) const; #endif }; bool a = A{} == A{}; // error } // 2) Type mismatch on CRTP namespace crtp_mismatch { template struct Base { #ifndef FIXED bool operator==(Derived const&) const; #else // in one case changed to taking Base const& friend bool operator==(Derived const&, Derived const&); #endif }; struct D : Base { }; bool b = D{} == D{}; // error } // 3) iterator/const_iterator with only mixed comparison namespace iter_const_iter { template struct iterator { using const_iterator = iterator; iterator(); template = 0> iterator(iterator const&); #ifndef FIXED bool operator==(const_iterator const&) const; #else friend bool operator==(iterator const&, iterator const&); #endif }; bool c = iterator{} == iterator{} // error || iterator{} == iterator{} || iterator{} == iterator{} || iterator{} == iterator{}; } // 4) Same-type comparison but only have mixed-type operator namespace ambiguous_choice { enum Color { Red }; struct C { C(); C(Color); operator Color() const; bool operator==(Color) const; friend bool operator==(C, C); }; bool c = C{} == C{}; // error bool d = C{} == Red; } Differential revision: https://reviews.llvm.org/D78938 Added: Modified: clang/include/clang/AST/StmtIterator.h clang/lib/Parse/ParseOpenMP.cpp clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp llvm/include/llvm/ADT/AllocatorList.h llvm/include/llvm/ADT/DenseMap.h llvm/include/llvm/ADT/DenseSet.h llvm/include/llvm/ADT/DirectedGraph.h llvm/include/llvm/ADT/STLExtras.h llvm/include/llvm/ADT/StringMap.h llvm/include/llvm/ADT/iterator.h llvm/include/llvm/CodeGen/DIE.h llvm/include/llvm/CodeGen/LiveInterval.h llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h llvm/include/llvm/IR/Attributes.h llvm/include/llvm/IR/BasicBlock.h llvm/include/llvm/Object/StackMapParser.h llvm/include/llvm/ProfileData/Coverage/CoverageMappingReader.h llvm/include/llvm/ProfileData/InstrProfReader.h llvm/include/llvm/Support/BinaryStreamRef.h llvm/include/llvm/Support/SuffixTree.h llvm/lib/CodeGen/PeepholeOptimizer.cpp llvm/lib/IR/Attributes.cpp llvm/lib/ObjectYAML/DWARFEmitter.cpp llvm/lib/Transforms/Scalar/GVNHoist.cpp llvm/tools/llvm-objdump/llvm-objdump.cpp llvm/unittests/ADT/STLExtrasTest.cpp Removed: diff --git a/clang/include/clang/AST/StmtIterator.h b/clang/include/clang/AST/StmtIterator.h index 911205347aad..bcdb0df829fb 100644 --- a/clang/include/clang/AST/StmtIterator.h +++ b/clang/include/clang/AST/StmtIterator.h @@ -104,12 +104,13 @@ class StmtIteratorImpl : public StmtIteratorBase, return tmp; } - bool operator==(const DERIVED& RHS) const { -return stmt == RHS.stmt && DGI == RHS.DGI && RawVAPtr == RHS.RawVAPtr; + friend bool operator==(const DERIVED &LHS, const DERIVED &RHS) { +return LHS.stmt == RHS.stmt && LHS.DGI == RHS.DGI && + LHS.RawVAPtr == RHS.RawVAPtr; } - bool operator!=(const DERIVED& RHS) const { -return stmt != RHS.stmt || DGI != RHS.DGI || RawVAPtr != RHS.RawVAPtr; + friend bool operator!=(const DERIVED &LHS, const DERIVED &RHS) { +return !(LHS == RHS); } REFERENCE operator*() const { diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index c4aa361b8262..db7e967b15ae 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -61,6 +61,12 @@ enum OpenMPDirectiveKindEx { struct OpenMPDirectiveKindExWrapper { OpenMPDirectiveKindExWrapper(unsigned Value) : Value(Value) {} OpenMPDirectiveKindE
[llvm-branch-commits] [llvm] f760d57 - LangRef: fix significand bits of fp128
Author: Nuno Lopes Date: 2020-12-31T11:13:25Z New Revision: f760d57052d8d16de9679f6c65149005515ead97 URL: https://github.com/llvm/llvm-project/commit/f760d57052d8d16de9679f6c65149005515ead97 DIFF: https://github.com/llvm/llvm-project/commit/f760d57052d8d16de9679f6c65149005515ead97.diff LOG: LangRef: fix significand bits of fp128 Added: Modified: llvm/docs/LangRef.rst Removed: diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 3db5879129ae..ab5287014683 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -3070,7 +3070,7 @@ Floating-Point Types - 64-bit floating-point value * - ``fp128`` - - 128-bit floating-point value (112-bit significand) + - 128-bit floating-point value (113-bit significand) * - ``x86_fp80`` - 80-bit floating-point value (X87) ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] a2513cb - remove pessimizing moves (reported by gcc 10)
Author: Nuno Lopes Date: 2020-12-31T20:35:56Z New Revision: a2513cb8655e0aea4baffb4391e946ad3e56d883 URL: https://github.com/llvm/llvm-project/commit/a2513cb8655e0aea4baffb4391e946ad3e56d883 DIFF: https://github.com/llvm/llvm-project/commit/a2513cb8655e0aea4baffb4391e946ad3e56d883.diff LOG: remove pessimizing moves (reported by gcc 10) Added: Modified: llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h Removed: diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h index 1c8b8e0bc922..63db9d4942ba 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h @@ -1510,20 +1510,20 @@ class SingleThreadedRPCEndpoint Args...)) { detail::ResultTraits::consumeAbandoned( std::move(Result)); - return std::move(Err); + return Err; } if (auto Err = this->C.send()) { detail::ResultTraits::consumeAbandoned( std::move(Result)); - return std::move(Err); + return Err; } while (!ReceivedResponse) { if (auto Err = this->handleOne()) { detail::ResultTraits::consumeAbandoned( std::move(Result)); -return std::move(Err); +return Err; } } ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] 3c01af9 - DenseMap: fix build with clang in C++20 mode
Author: Nuno Lopes Date: 2020-12-08T18:39:31Z New Revision: 3c01af9aeebe01030e6138cece02675d2f148bb3 URL: https://github.com/llvm/llvm-project/commit/3c01af9aeebe01030e6138cece02675d2f148bb3 DIFF: https://github.com/llvm/llvm-project/commit/3c01af9aeebe01030e6138cece02675d2f148bb3.diff LOG: DenseMap: fix build with clang in C++20 mode clang was complaing about this code: llvm/include/llvm/IR/PassManager.h:715:17: error: ISO C++20 considers use of overloaded operator '!=' to be ambiguous despite there being a unique best viable function with non-reversed arguments [-Werror,-Wambiguous-reversed-operator] if (IMapI != IsResultInvalidated.end()) ~ ^ ~ llvm/include/llvm/ADT/DenseMap.h:1253:8: note: candidate function with non-reversed arguments bool operator!=(const ConstIterator &RHS) const { ^ llvm/include/llvm/ADT/DenseMap.h:1246:8: note: ambiguous candidate function with reversed arguments bool operator==(const ConstIterator &RHS) const { ^ The warning is triggered when the DenseMapIterator (lhs) is not const and so the == operator is applied to different types on lhs/rhs. Using a template allows the function to be available for both const/non-const iterator types and gets rid of the warning Added: Modified: llvm/include/llvm/ADT/DenseMap.h Removed: diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index f591ee07ac00..7da347125c34 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -1189,8 +1189,6 @@ class DenseMapIterator : DebugEpochBase::HandleBase { friend class DenseMapIterator; friend class DenseMapIterator; - using ConstIterator = DenseMapIterator; - public: using diff erence_type = ptr diff _t; using value_type = @@ -1243,14 +1241,17 @@ class DenseMapIterator : DebugEpochBase::HandleBase { return Ptr; } - bool operator==(const ConstIterator &RHS) const { + template + bool operator==(const T &RHS) const { assert((!Ptr || isHandleInSync()) && "handle not in sync!"); assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!"); assert(getEpochAddress() == RHS.getEpochAddress() && "comparing incomparable iterators!"); return Ptr == RHS.Ptr; } - bool operator!=(const ConstIterator &RHS) const { + + template + bool operator!=(const T &RHS) const { assert((!Ptr || isHandleInSync()) && "handle not in sync!"); assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!"); assert(getEpochAddress() == RHS.getEpochAddress() && ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] d2a7b83 - AA: make AliasAnalysis.h compatible with C++20 (NFC)
Author: Nuno Lopes Date: 2020-12-10T15:32:11Z New Revision: d2a7b83c5c7b9b26e73261be2a4d60a5b53ba80f URL: https://github.com/llvm/llvm-project/commit/d2a7b83c5c7b9b26e73261be2a4d60a5b53ba80f DIFF: https://github.com/llvm/llvm-project/commit/d2a7b83c5c7b9b26e73261be2a4d60a5b53ba80f.diff LOG: AA: make AliasAnalysis.h compatible with C++20 (NFC) can't mix arithmetic with different enums Added: Modified: llvm/include/llvm/Analysis/AliasAnalysis.h Removed: diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h index ce4ebab3efa4..cc5cec44b455 100644 --- a/llvm/include/llvm/Analysis/AliasAnalysis.h +++ b/llvm/include/llvm/Analysis/AliasAnalysis.h @@ -540,7 +540,7 @@ class AAResults { /// write at most from objects pointed to by their pointer-typed arguments /// (with arbitrary offsets). static bool onlyAccessesArgPointees(FunctionModRefBehavior MRB) { -return !(MRB & FMRL_Anywhere & ~FMRL_ArgumentPointees); +return !((unsigned)MRB & FMRL_Anywhere & ~FMRL_ArgumentPointees); } /// Checks if functions with the specified behavior are known to potentially @@ -548,26 +548,27 @@ class AAResults { /// (with arbitrary offsets). static bool doesAccessArgPointees(FunctionModRefBehavior MRB) { return isModOrRefSet(createModRefInfo(MRB)) && - (MRB & FMRL_ArgumentPointees); + ((unsigned)MRB & FMRL_ArgumentPointees); } /// Checks if functions with the specified behavior are known to read and /// write at most from memory that is inaccessible from LLVM IR. static bool onlyAccessesInaccessibleMem(FunctionModRefBehavior MRB) { -return !(MRB & FMRL_Anywhere & ~FMRL_InaccessibleMem); +return !((unsigned)MRB & FMRL_Anywhere & ~FMRL_InaccessibleMem); } /// Checks if functions with the specified behavior are known to potentially /// read or write from memory that is inaccessible from LLVM IR. static bool doesAccessInaccessibleMem(FunctionModRefBehavior MRB) { -return isModOrRefSet(createModRefInfo(MRB)) && (MRB & FMRL_InaccessibleMem); +return isModOrRefSet(createModRefInfo(MRB)) && + ((unsigned)MRB & FMRL_InaccessibleMem); } /// Checks if functions with the specified behavior are known to read and /// write at most from memory that is inaccessible from LLVM IR or objects /// pointed to by their pointer-typed arguments (with arbitrary offsets). static bool onlyAccessesInaccessibleOrArgMem(FunctionModRefBehavior MRB) { -return !(MRB & FMRL_Anywhere & +return !((unsigned)MRB & FMRL_Anywhere & ~(FMRL_InaccessibleMem | FMRL_ArgumentPointees)); } ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits