[PATCH] D116262: [clang] adds `__remove_reference` as a compiler built-in

2021-12-24 Thread Christopher Di Bella via Phabricator via cfe-commits
cjdb added a comment.

Merged into D116203 .


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116262/new/

https://reviews.llvm.org/D116262

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D116262: [clang] adds `__remove_reference` as a compiler built-in

2021-12-23 Thread Dávid Bolvanský via Phabricator via cfe-commits
xbolva00 added a comment.

Missing description / motivation.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116262/new/

https://reviews.llvm.org/D116262

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D116262: [clang] adds `__remove_reference` as a compiler built-in

2021-12-23 Thread Christopher Di Bella via Phabricator via cfe-commits
cjdb created this revision.
cjdb added a reviewer: aaron.ballman.
Herald added a subscriber: dexonsmith.
cjdb requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D116262

Files:
  clang/include/clang/AST/Type.h
  clang/include/clang/Basic/Specifiers.h
  clang/include/clang/Basic/TokenKinds.def
  clang/include/clang/Sema/DeclSpec.h
  clang/lib/AST/ItaniumMangle.cpp
  clang/lib/AST/JSONNodeDumper.cpp
  clang/lib/AST/TypePrinter.cpp
  clang/lib/Format/FormatToken.cpp
  clang/lib/Lex/PPMacroExpansion.cpp
  clang/lib/Parse/ParseDecl.cpp
  clang/lib/Parse/ParseDeclCXX.cpp
  clang/lib/Sema/DeclSpec.cpp
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaTemplateVariadic.cpp
  clang/lib/Sema/SemaType.cpp
  clang/test/SemaCXX/remove_cvref.cpp

Index: clang/test/SemaCXX/remove_cvref.cpp
===
--- clang/test/SemaCXX/remove_cvref.cpp
+++ clang/test/SemaCXX/remove_cvref.cpp
@@ -1,5 +1,24 @@
 // RUN: %clang_cc1 -std=c++11 %s
 
+template
+struct check_remove_reference {
+  constexpr check_remove_reference() {
+static_assert(__is_same(__remove_reference(T&), T), "");
+static_assert(__is_same(__remove_reference(const T&), const T), "");
+static_assert(__is_same(__remove_reference(volatile T&), volatile T), "");
+static_assert(__is_same(__remove_reference(const volatile T&), const volatile T), "");
+
+static_assert(__is_same(__remove_reference(T&&), T), "");
+static_assert(__is_same(__remove_reference(const T&&), const T), "");
+static_assert(__is_same(__remove_reference(volatile T&&), volatile T), "");
+static_assert(__is_same(__remove_reference(const volatile T&&), const volatile T), "");
+  }
+};
+
+template<> struct check_remove_reference {};
+template struct check_remove_reference {};
+template struct check_remove_reference {};
+
 template 
 constexpr bool check_remove_qualifiers() {
   static_assert(__is_same(__remove_const(const T), T), "");
@@ -13,6 +32,9 @@
   static_assert(__is_same(__remove_cv(const T), T), "");
   static_assert(__is_same(__remove_cv(volatile T), T), "");
   static_assert(__is_same(__remove_cv(const volatile T), T), "");
+
+  check_remove_reference();
+
   return true;
 }
 
@@ -26,6 +48,10 @@
 static_assert(check_remove_qualifiers(), "");
 static_assert(check_remove_qualifiers(), "");
 static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
 static_assert(check_remove_qualifiers(), "");
 static_assert(check_remove_qualifiers(), "");
 static_assert(check_remove_qualifiers(), "");
Index: clang/lib/Sema/SemaType.cpp
===
--- clang/lib/Sema/SemaType.cpp
+++ clang/lib/Sema/SemaType.cpp
@@ -1271,6 +1271,8 @@
 return UnaryTransformType::RemoveConst;
   case TST_remove_cv:
 return UnaryTransformType::RemoveCV;
+  case TST_remove_reference:
+return UnaryTransformType::RemoveReference;
   case TST_remove_volatile:
 return UnaryTransformType::RemoveVolatile;
   case TST_underlyingType:
@@ -1668,6 +1670,7 @@
   case DeclSpec::TST_add_volatile:
   case DeclSpec::TST_remove_const:
   case DeclSpec::TST_remove_cv:
+  case DeclSpec::TST_remove_reference:
   case DeclSpec::TST_remove_volatile:
 Result = S.GetTypeFromParser(DS.getRepAsType());
 assert(!Result.isNull() && "Didn't get a type for the transformation?");
@@ -9096,6 +9099,11 @@
   return Context.getUnaryTransformType(BaseType, Underlying,
 UnaryTransformType::EnumUnderlyingType);
 }
+  case UnaryTransformType::RemoveReference: {
+QualType Underlying = BaseType.getNonReferenceType();
+return Context.getUnaryTransformType(BaseType, Underlying,
+ UnaryTransformType::RemoveReference);
+  }
   case UnaryTransformType::AddConst:
   case UnaryTransformType::AddCV:
   case UnaryTransformType::AddVolatile:
Index: clang/lib/Sema/SemaTemplateVariadic.cpp
===
--- clang/lib/Sema/SemaTemplateVariadic.cpp
+++ clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -866,6 +866,7 @@
   case TST_add_volatile:
   case TST_remove_const:
   case TST_remove_cv:
+  case TST_remove_reference:
   case TST_remove_volatile:
   case TST_atomic: {
 QualType T = DS.getRepAsType().get();
Index: clang/lib/Sema/SemaDecl.cpp
===
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -150,6 +150,7 @@
   case tok::kw___add_volatile:
   case tok::kw___remove_const:
   case tok::kw___remove_cv:
+  case tok::kw___remove_reference:
   case tok::kw___remove_volatile:
   case tok::kw___auto_type: