<div dir="ltr">Should this go into 5.0 ?</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 25, 2017 at 4:33 PM, David Majnemer via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Tue Jul 25 16:33:58 2017<br>
New Revision: 309058<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=309058&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=309058&view=rev</a><br>
Log:<br>
[CodeGen] Correctly model std::byte's aliasing properties<br>
<br>
std::byte, when defined as an enum, needs to be given special treatment<br>
with regards to its aliasing properties. An array of std::byte is<br>
allowed to be used as storage for other types.<br>
<br>
This fixes PR33916.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D35824" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D35824</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGenCXX/std-<wbr>byte.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/AST/<wbr>Type.h<br>
    cfe/trunk/lib/AST/Type.cpp<br>
    cfe/trunk/lib/CodeGen/<wbr>CodeGenTBAA.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/<wbr>Type.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=309058&r1=309057&r2=309058&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/Type.h?rev=309058&<wbr>r1=309057&r2=309058&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/AST/<wbr>Type.h (original)<br>
+++ cfe/trunk/include/clang/AST/<wbr>Type.h Tue Jul 25 16:33:58 2017<br>
@@ -1752,6 +1752,7 @@ public:<br>
   bool isTemplateTypeParmType() const;          // C++ template type parameter<br>
   bool isNullPtrType() const;                   // C++11 std::nullptr_t<br>
   bool isAlignValT() const;                     // C++17 std::align_val_t<br>
+  bool isStdByteType() const;                   // C++17 std::byte<br>
   bool isAtomicType() const;                    // C11 _Atomic()<br>
<br>
 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \<br>
<br>
Modified: cfe/trunk/lib/AST/Type.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=309058&r1=309057&r2=309058&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>Type.cpp?rev=309058&r1=309057&<wbr>r2=309058&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/Type.cpp (original)<br>
+++ cfe/trunk/lib/AST/Type.cpp Tue Jul 25 16:33:58 2017<br>
@@ -2313,6 +2313,15 @@ bool Type::isAlignValT() const {<br>
   return false;<br>
 }<br>
<br>
+bool Type::isStdByteType() const {<br>
+  if (auto *ET = getAs<EnumType>()) {<br>
+    auto *II = ET->getDecl()->getIdentifier()<wbr>;<br>
+    if (II && II->isStr("byte") && ET->getDecl()-><wbr>isInStdNamespace())<br>
+      return true;<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
 bool Type::isPromotableIntegerType(<wbr>) const {<br>
   if (const BuiltinType *BT = getAs<BuiltinType>())<br>
     switch (BT->getKind()) {<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenTBAA.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=309058&r1=309057&r2=309058&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenTBAA.cpp?rev=309058&r1=<wbr>309057&r2=309058&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CodeGenTBAA.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CodeGenTBAA.cpp Tue Jul 25 16:33:58 2017<br>
@@ -139,6 +139,12 @@ CodeGenTBAA::getTBAAInfo(<wbr>QualType QTy) {<br>
     }<br>
   }<br>
<br>
+  // C++1z [basic.lval]p10: "If a program attempts to access the stored value of<br>
+  // an object through a glvalue of other than one of the following types the<br>
+  // behavior is undefined: [...] a char, unsigned char, or std::byte type."<br>
+  if (Ty->isStdByteType())<br>
+    return MetadataCache[Ty] = getChar();<br>
+<br>
   // Handle pointers.<br>
   // TODO: Implement C++'s type "similarity" and consider dis-"similar"<br>
   // pointers distinct.<br>
<br>
Added: cfe/trunk/test/CodeGenCXX/std-<wbr>byte.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/std-byte.cpp?rev=309058&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/std-byte.cpp?rev=<wbr>309058&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/std-<wbr>byte.cpp (added)<br>
+++ cfe/trunk/test/CodeGenCXX/std-<wbr>byte.cpp Tue Jul 25 16:33:58 2017<br>
@@ -0,0 +1,41 @@<br>
+// RUN: %clang_cc1 -std=c++1z -Werror -triple i386-unknown-unknown -emit-llvm -O1 -disable-llvm-passes -o - %s | FileCheck %s<br>
+<br>
+// std::byte should be considered equivalent to char for aliasing.<br>
+<br>
+namespace std {<br>
+enum byte : unsigned char {};<br>
+}<br>
+<br>
+// CHECK-LABEL: define void @test0(<br>
+extern "C" void test0(std::byte *sb, int *i) {<br>
+  // CHECK: store i8 0, i8* %{{.*}} !tbaa [[TAG_CHAR:!.*]]<br>
+  *sb = std::byte{0};<br>
+<br>
+  // CHECK: store i32 1, i32* %{{.*}} !tbaa [[TAG_INT:!.*]]<br>
+  *i = 1;<br>
+}<br>
+<br>
+enum byte : unsigned char {};<br>
+namespace my {<br>
+enum byte : unsigned char {};<br>
+namespace std {<br>
+enum byte : unsigned char {};<br>
+} // namespace std<br>
+} // namespace my<br>
+<br>
+// Make sure we don't get confused with other enums named 'byte'.<br>
+<br>
+// CHECK-LABEL: define void @test1(<br>
+extern "C" void test1(::byte *b, ::my::byte *mb, ::my::std::byte *msb) {<br>
+  *b = ::byte{0};<br>
+  *mb = ::my::byte{0};<br>
+  *msb = ::my::std::byte{0};<br>
+  // CHECK-NOT: store i8 0, i8* %{{.*}} !tbaa [[TAG_CHAR]]<br>
+}<br>
+<br>
+// CHECK:  !"any pointer", [[TYPE_CHAR:!.*]],<br>
+// CHECK: [[TYPE_CHAR]] = !{!"omnipotent char", [[TAG_CXX_TBAA:!.*]],<br>
+// CHECK: [[TAG_CXX_TBAA]] = !{!"Simple C++ TBAA"}<br>
+// CHECK: [[TAG_CHAR]] = !{[[TYPE_CHAR:!.*]], [[TYPE_CHAR]], i64 0}<br>
+// CHECK: [[TAG_INT]] = !{[[TYPE_INT:!.*]], [[TYPE_INT]], i64 0}<br>
+// CHECK: [[TYPE_INT]] = !{!"int", [[TYPE_CHAR]]<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>