[PATCH] D116226: [clang] adds `__remove_const` as a compiler built-in

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

Merged into D116203 .


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D116226

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


[PATCH] D116226: [clang] adds `__remove_const` 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/D116226

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
===
--- /dev/null
+++ clang/test/SemaCXX/remove_cvref.cpp
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -std=c++11 %s
+
+template 
+constexpr bool check_remove_qualifiers() {
+  static_assert(__is_same(__remove_const(const T), T), "");
+  return true;
+}
+
+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(), "");
+static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
+static_assert(check_remove_qualifiers(), "");
+
+struct S {};
+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(), "");
+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
@@ -22,6 +22,7 @@
 #include "clang/AST/TypeLoc.h"
 #include "clang/AST/TypeLocVisitor.h"
 #include "clang/Basic/PartialDiagnostic.h"
+#include "clang/Basic/Specifiers.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Sema/DeclSpec.h"
@@ -1266,6 +1267,8 @@
 return UnaryTransformType::AddCV;
   case TST_add_volatile:
 return UnaryTransformType::AddVolatile;
+  case TST_remove_const:
+return UnaryTransformType::RemoveConst;
   case TST_underlyingType:
 return UnaryTransformType::EnumUnderlyingType;
   default:
@@ -1659,6 +1662,7 @@
   case DeclSpec::TST_add_const:
   case DeclSpec::TST_add_cv:
   case DeclSpec::TST_add_volatile:
+  case DeclSpec::TST_remove_const:
 Result = S.GetTypeFromParser(DS.getRepAsType());
 assert(!Result.isNull() && "Didn't get a type for the transformation?");
 Result = S.BuildUnaryTransformType(
@@ -5996,7 +6000,7 @@
 void VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
   // Make sure it is a unary transform type
   assert(DS.getTypeSpecType() >= DeclSpec::TST_underlyingType &&
- DS.getTypeSpecType() <= DeclSpec::TST_add_volatile);
+ DS.getTypeSpecType() <= DeclSpec::TST_remove_const);
   TL.setKWLoc(DS.getTypeSpecTypeLoc());
   TL.setParensRange(DS.getTypeofParensRange());
   assert(DS.getRepAsType());
@@ -9088,7 +9092,8 @@
 }
   case UnaryTransformType::AddConst:
   case UnaryTransformType::AddCV:
-  case UnaryTransformType::AddVolatile: {
+  case UnaryTransformType::AddVolatile:
+  case UnaryTransformType::RemoveConst: {
 SplitQualType Split = BaseType.getSplitUnqualifiedType();
 Qualifiers Quals = BaseType.getQualifiers();
 if (BaseType->isReferenceType() || BaseType->isFunctionType())
@@ -9102,6 +9107,10 @@
   [[fallthrough]];
 case UnaryTransformType::AddVolatile:
   Quals.addVolatile();
+  break;
+case UnaryTransformType::RemoveConst:
+  Quals.removeConst();
+  break;
 }
 QualType Underlying(Split.Ty, Quals.getAsOpaqueValue());
 return Context.getUnaryTransformType(BaseType, Underlying, UKind);
Index: