[PATCH] D71827: [clang] avoid strict aliasing violation in assert

Ryan Libby via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Dec 22 23:29:41 PST 2019


rlibby created this revision.
rlibby added reviewers: akyrtzi, rsmith.
Herald added subscribers: cfe-commits, dexonsmith.
Herald added a project: clang.

StoredDeclsList::setOnlyValue wants to assert that the binary value
actually stored in the member PointerUnion Data is the same as the raw
NamedDecl pointer argument.  However the way in which it was checking
this involved a cast which created a type-punned pointer, and
dereferencing that pointer broke strict aliasing rules.

I have a build of clang by gcc where gcc emitted code to read from the
pointer for the assert before writing to it and so caused the assertion
to fail.

I'm not sure this is the best alternative formulation for the assert.
Please feel free to suggest another spelling as appropriate.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71827

Files:
  clang/include/clang/AST/DeclContextInternals.h


Index: clang/include/clang/AST/DeclContextInternals.h
===================================================================
--- clang/include/clang/AST/DeclContextInternals.h
+++ clang/include/clang/AST/DeclContextInternals.h
@@ -99,7 +99,7 @@
     Data = ND;
     // Make sure that Data is a plain NamedDecl* so we can use its address
     // at getLookupResult.
-    assert(*(NamedDecl **)&Data == ND &&
+    assert(Data.getAddrOfPtr1() && *Data.getAddrOfPtr1() == ND &&
            "PointerUnion mangles the NamedDecl pointer!");
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71827.235096.patch
Type: text/x-patch
Size: 538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191223/57e4d046/attachment.bin>


More information about the cfe-commits mailing list