<div dir="ltr"><div dir="ltr">On Tue, 22 Sep 2020 at 17:42, Leonard Chan via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: Leonard Chan<br>
Date: 2020-09-22T17:40:53-07:00<br>
New Revision: 15d94a7d0f8f0d6b3b5308fff51b286957e45650<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/15d94a7d0f8f0d6b3b5308fff51b286957e45650.diff</a><br>
<br>
LOG: Revert "Canonicalize declaration pointers when forming APValues."<br>
<br>
This reverts commit 905b9ca26c94fa86339451a528cedde5004fc1bb.<br>
<br>
Reverting because this strips `weak` attributes off function<br>
declarations, leading to the linker error we see at<br>
<a href="https://ci.chromium.org/p/fuchsia/builders/ci/clang_toolchain.fuchsia-arm64-debug-subbuild/b8868932035091473008" rel="noreferrer" target="_blank">https://ci.chromium.org/p/fuchsia/builders/ci/clang_toolchain.fuchsia-arm64-debug-subbuild/b8868932035091473008</a>.<br>
<br>
See <a href="https://reviews.llvm.org/rG905b9ca26c94" rel="noreferrer" target="_blank">https://reviews.llvm.org/rG905b9ca26c94</a> for reproducer details.<br></blockquote><div><br></div><div>Thanks, re-committed with a fix in 9dcd96f728863d40d6f5922ed52732fdd728fb5f.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Added: <br>
<br>
<br>
Modified: <br>
    clang/include/clang/AST/APValue.h<br>
    clang/lib/AST/APValue.cpp<br>
    clang/lib/AST/Decl.cpp<br>
    clang/lib/AST/DeclBase.cpp<br>
    clang/lib/AST/ExprConstant.cpp<br>
    clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp<br>
    clang/test/OpenMP/ordered_messages.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h<br>
index 6307f8a92e5a..5103cfa8604e 100644<br>
--- a/clang/include/clang/AST/APValue.h<br>
+++ b/clang/include/clang/AST/APValue.h<br>
@@ -174,7 +174,6 @@ class APValue {<br>
       return !(LHS == RHS);<br>
     }<br>
     friend llvm::hash_code hash_value(const LValueBase &Base);<br>
-    friend struct llvm::DenseMapInfo<LValueBase>;<br>
<br>
   private:<br>
     PtrTy Ptr;<br>
@@ -202,7 +201,8 @@ class APValue {<br>
<br>
   public:<br>
     LValuePathEntry() : Value() {}<br>
-    LValuePathEntry(BaseOrMemberType BaseOrMember);<br>
+    LValuePathEntry(BaseOrMemberType BaseOrMember)<br>
+        : Value{reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue())} {}<br>
     static LValuePathEntry ArrayIndex(uint64_t Index) {<br>
       LValuePathEntry Result;<br>
       Result.Value = Index;<br>
<br>
diff  --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp<br>
index 32d3ff7ce1d0..08ae0ff3c67d 100644<br>
--- a/clang/lib/AST/APValue.cpp<br>
+++ b/clang/lib/AST/APValue.cpp<br>
@@ -38,7 +38,7 @@ static_assert(<br>
     "Type is insufficiently aligned");<br>
<br>
 APValue::LValueBase::LValueBase(const ValueDecl *P, unsigned I, unsigned V)<br>
-    : Ptr(P ? cast<ValueDecl>(P->getCanonicalDecl()) : nullptr), Local{I, V} {}<br>
+    : Ptr(P), Local{I, V} {}<br>
 APValue::LValueBase::LValueBase(const Expr *P, unsigned I, unsigned V)<br>
     : Ptr(P), Local{I, V} {}<br>
<br>
@@ -82,19 +82,13 @@ bool operator==(const APValue::LValueBase &LHS,<br>
                 const APValue::LValueBase &RHS) {<br>
   if (LHS.Ptr != RHS.Ptr)<br>
     return false;<br>
-  if (LHS.is<TypeInfoLValue>() || LHS.is<DynamicAllocLValue>())<br>
+  if (LHS.is<TypeInfoLValue>())<br>
     return true;<br>
   return LHS.Local.CallIndex == RHS.Local.CallIndex &&<br>
          LHS.Local.Version == RHS.Local.Version;<br>
 }<br>
 }<br>
<br>
-APValue::LValuePathEntry::LValuePathEntry(BaseOrMemberType BaseOrMember) {<br>
-  if (const Decl *D = BaseOrMember.getPointer())<br>
-    BaseOrMember.setPointer(D->getCanonicalDecl());<br>
-  Value = reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());<br>
-}<br>
-<br>
 namespace {<br>
   struct LVBase {<br>
     APValue::LValueBase Base;<br>
@@ -119,16 +113,14 @@ APValue::LValueBase::operator bool () const {<br>
<br>
 clang::APValue::LValueBase<br>
 llvm::DenseMapInfo<clang::APValue::LValueBase>::getEmptyKey() {<br>
-  clang::APValue::LValueBase B;<br>
-  B.Ptr = DenseMapInfo<const ValueDecl*>::getEmptyKey();<br>
-  return B;<br>
+  return clang::APValue::LValueBase(<br>
+      DenseMapInfo<const ValueDecl*>::getEmptyKey());<br>
 }<br>
<br>
 clang::APValue::LValueBase<br>
 llvm::DenseMapInfo<clang::APValue::LValueBase>::getTombstoneKey() {<br>
-  clang::APValue::LValueBase B;<br>
-  B.Ptr = DenseMapInfo<const ValueDecl*>::getTombstoneKey();<br>
-  return B;<br>
+  return clang::APValue::LValueBase(<br>
+      DenseMapInfo<const ValueDecl*>::getTombstoneKey());<br>
 }<br>
<br>
 namespace clang {<br>
@@ -781,10 +773,8 @@ void APValue::MakeMemberPointer(const ValueDecl *Member, bool IsDerivedMember,<br>
   assert(isAbsent() && "Bad state change");<br>
   MemberPointerData *MPD = new ((void*)(char*)Data.buffer) MemberPointerData;<br>
   Kind = MemberPointer;<br>
-  MPD->MemberAndIsDerivedMember.setPointer(<br>
-      Member ? cast<ValueDecl>(Member->getCanonicalDecl()) : nullptr);<br>
+  MPD->MemberAndIsDerivedMember.setPointer(Member);<br>
   MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);<br>
   MPD->resizePath(Path.size());<br>
-  for (unsigned I = 0; I != Path.size(); ++I)<br>
-    MPD->getPath()[I] = Path[I]->getCanonicalDecl();<br>
+  memcpy(MPD->getPath(), Path.data(), Path.size()*sizeof(const CXXRecordDecl*));<br>
 }<br>
<br>
diff  --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp<br>
index ae38e3dd2a72..0ee1399d42df 100644<br>
--- a/clang/lib/AST/Decl.cpp<br>
+++ b/clang/lib/AST/Decl.cpp<br>
@@ -4686,7 +4686,7 @@ char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];<br>
 void ValueDecl::anchor() {}<br>
<br>
 bool ValueDecl::isWeak() const {<br>
-  for (const auto *I : getMostRecentDecl()->attrs())<br>
+  for (const auto *I : attrs())<br>
     if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I))<br>
       return true;<br>
<br>
<br>
diff  --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp<br>
index ab2b55c0762e..f4314d0bd961 100644<br>
--- a/clang/lib/AST/DeclBase.cpp<br>
+++ b/clang/lib/AST/DeclBase.cpp<br>
@@ -720,7 +720,7 @@ bool Decl::isWeakImported() const {<br>
   if (!canBeWeakImported(IsDefinition))<br>
     return false;<br>
<br>
-  for (const auto *A : getMostRecentDecl()->attrs()) {<br>
+  for (const auto *A : attrs()) {<br>
     if (isa<WeakImportAttr>(A))<br>
       return true;<br>
<br>
<br>
diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp<br>
index 8e43b62662ee..e8f132dd4803 100644<br>
--- a/clang/lib/AST/ExprConstant.cpp<br>
+++ b/clang/lib/AST/ExprConstant.cpp<br>
@@ -1978,11 +1978,18 @@ static bool HasSameBase(const LValue &A, const LValue &B) {<br>
     return false;<br>
<br>
   if (A.getLValueBase().getOpaqueValue() !=<br>
-      B.getLValueBase().getOpaqueValue())<br>
-    return false;<br>
+      B.getLValueBase().getOpaqueValue()) {<br>
+    const Decl *ADecl = GetLValueBaseDecl(A);<br>
+    if (!ADecl)<br>
+      return false;<br>
+    const Decl *BDecl = GetLValueBaseDecl(B);<br>
+    if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())<br>
+      return false;<br>
+  }<br>
<br>
-  return A.getLValueCallIndex() == B.getLValueCallIndex() &&<br>
-         A.getLValueVersion() == B.getLValueVersion();<br>
+  return IsGlobalLValue(A.getLValueBase()) ||<br>
+         (A.getLValueCallIndex() == B.getLValueCallIndex() &&<br>
+          A.getLValueVersion() == B.getLValueVersion());<br>
 }<br>
<br>
 static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {<br>
@@ -3101,8 +3108,7 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,<br>
<br>
   // If we're currently evaluating the initializer of this declaration, use that<br>
   // in-flight value.<br>
-  if (declaresSameEntity(Info.EvaluatingDecl.dyn_cast<const ValueDecl *>(),<br>
-                         VD)) {<br>
+  if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) {<br>
     Result = Info.EvaluatingDeclValue;<br>
     return true;<br>
   }<br>
<br>
diff  --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp<br>
index 3720b277af7a..8d51dbde7177 100644<br>
--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp<br>
+++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp<br>
@@ -24,10 +24,11 @@ constexpr double &ni3; // expected-error {{declaration of reference variable 'ni<br>
<br>
 constexpr int nc1 = i; // expected-error {{constexpr variable 'nc1' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}<br>
 constexpr C nc2 = C(); // expected-error {{cannot have non-literal type 'const C'}}<br>
-int &f(); // expected-note 2{{declared here}}<br>
+int &f(); // expected-note {{declared here}}<br>
 constexpr int &nc3 = f(); // expected-error {{constexpr variable 'nc3' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}<br>
 constexpr int nc4(i); // expected-error {{constexpr variable 'nc4' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}<br>
 constexpr C nc5((C())); // expected-error {{cannot have non-literal type 'const C'}}<br>
+int &f(); // expected-note {{here}}<br>
 constexpr int &nc6(f()); // expected-error {{constexpr variable 'nc6' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f'}}<br>
<br>
 struct pixel {<br>
<br>
diff  --git a/clang/test/OpenMP/ordered_messages.cpp b/clang/test/OpenMP/ordered_messages.cpp<br>
index 8a3a86443eb8..f6b9dbd6d27f 100644<br>
--- a/clang/test/OpenMP/ordered_messages.cpp<br>
+++ b/clang/test/OpenMP/ordered_messages.cpp<br>
@@ -16,9 +16,6 @@ void xxx(int argc) {<br>
 }<br>
<br>
 int foo();<br>
-#if __cplusplus >= 201103L<br>
-// expected-note@-2 {{declared here}}<br>
-#endif<br>
<br>
 template <class T><br>
 T foo() {<br>
@@ -179,7 +176,7 @@ T foo() {<br>
<br>
 int foo() {<br>
 #if __cplusplus >= 201103L<br>
-// expected-note@-2 {{declared here}}<br>
+// expected-note@-2 2 {{declared here}}<br>
 #endif<br>
 int k;<br>
   #pragma omp for ordered<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div>