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 <class T>
+constexpr bool check_remove_qualifiers() {
+ static_assert(__is_same(__remove_const(const T), T), "");
+ return true;
+}
+
+static_assert(check_remove_qualifiers<void>(), "");
+static_assert(check_remove_qualifiers<int>(), "");
+static_assert(check_remove_qualifiers<int *>(), "");
+static_assert(check_remove_qualifiers<const int *>(), "");
+static_assert(check_remove_qualifiers<volatile int *>(), "");
+static_assert(check_remove_qualifiers<const volatile int *>(), "");
+static_assert(check_remove_qualifiers<int &>(), "");
+static_assert(check_remove_qualifiers<const int &>(), "");
+static_assert(check_remove_qualifiers<volatile int &>(), "");
+static_assert(check_remove_qualifiers<const volatile int &>(), "");
+static_assert(check_remove_qualifiers<int()>(), "");
+static_assert(check_remove_qualifiers<int (*)()>(), "");
+static_assert(check_remove_qualifiers<int (&)()>(), "");
+
+struct S {};
+static_assert(check_remove_qualifiers<S>(), "");
+static_assert(check_remove_qualifiers<int S::*>(), "");
+static_assert(check_remove_qualifiers<const int S::*>(), "");
+static_assert(check_remove_qualifiers<volatile int S::*>(), "");
+static_assert(check_remove_qualifiers<const volatile int S::*>(), "");
+static_assert(check_remove_qualifiers<int (S::*)()>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() &>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() &&>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const &>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const &&>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() volatile>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() volatile &>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() volatile &&>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const volatile>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const volatile &>(), "");
+static_assert(check_remove_qualifiers<int (S::*)() const volatile &&>(), "");
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: clang/lib/Sema/SemaTemplateVariadic.cpp
===================================================================
--- clang/lib/Sema/SemaTemplateVariadic.cpp
+++ clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -863,6 +863,7 @@
case TST_underlyingType:
case TST_add_const:
case TST_add_cv:
+ case TST_remove_const:
case TST_add_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
@@ -147,6 +147,7 @@
case tok::kw___underlying_type:
case tok::kw___add_const:
case tok::kw___add_cv:
+ case tok::kw___remove_const:
case tok::kw___add_volatile:
case tok::kw___auto_type:
return true;
@@ -5604,6 +5605,7 @@
case DeclSpec::TST_underlyingType:
case DeclSpec::TST_add_const:
case DeclSpec::TST_add_cv:
+ case DeclSpec::TST_remove_const:
case DeclSpec::TST_add_volatile:
case DeclSpec::TST_atomic: {
// Grab the type from the parser.
Index: clang/lib/Sema/DeclSpec.cpp
===================================================================
--- clang/lib/Sema/DeclSpec.cpp
+++ clang/lib/Sema/DeclSpec.cpp
@@ -18,6 +18,7 @@
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Specifiers.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/ParsedTemplate.h"
#include "clang/Sema/Sema.h"
@@ -393,6 +394,7 @@
case TST_add_const:
case TST_add_cv:
case TST_add_volatile:
+ case TST_remove_const:
case TST_typename:
case TST_typeofType: {
QualType QT = DS.getRepAsType().get();
@@ -584,6 +586,8 @@
return "__add_const";
case DeclSpec::TST_add_cv:
return "__add_cv";
+ case DeclSpec::TST_remove_const:
+ return "__remove_const";
case DeclSpec::TST_add_volatile:
return "__add_volatile";
case DeclSpec::TST_unknown_anytype: return "__unknown_anytype";
Index: clang/lib/Parse/ParseDeclCXX.cpp
===================================================================
--- clang/lib/Parse/ParseDeclCXX.cpp
+++ clang/lib/Parse/ParseDeclCXX.cpp
@@ -1534,7 +1534,7 @@
tok::kw___is_trivially_assignable,
tok::kw___is_trivially_constructible, tok::kw___is_trivially_copyable,
tok::kw___is_union, tok::kw___is_unsigned, tok::kw___is_void,
- tok::kw___is_volatile))
+ tok::kw___is_volatile, tok::kw___remove_const))
// GNU libstdc++ 4.2 and libc++ use certain intrinsic names as the
// name of struct templates, but some are keywords in GCC >= 4.3
// and Clang. Therefore, when we see the token sequence "struct
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -4118,6 +4118,7 @@
case tok::kw___add_const:
case tok::kw___add_cv:
case tok::kw___add_volatile:
+ case tok::kw___remove_const:
ParseTypeTransformTypeSpecifier(DS);
continue;
@@ -4229,6 +4230,8 @@
return DeclSpec::TST_add_cv;
case tok::kw___add_volatile:
return DeclSpec::TST_add_volatile;
+ case tok::kw___remove_const:
+ return DeclSpec::TST_remove_const;
}
__builtin_unreachable();
Index: clang/lib/Lex/PPMacroExpansion.cpp
===================================================================
--- clang/lib/Lex/PPMacroExpansion.cpp
+++ clang/lib/Lex/PPMacroExpansion.cpp
@@ -1661,6 +1661,7 @@
.Case("__add_const", true)
.Case("__add_cv", true)
.Case("__add_volatile", true)
+ .Case("__remove_const", true)
.Default(false);
} else {
return llvm::StringSwitch<bool>(II->getName())
Index: clang/lib/Format/FormatToken.cpp
===================================================================
--- clang/lib/Format/FormatToken.cpp
+++ clang/lib/Format/FormatToken.cpp
@@ -60,6 +60,7 @@
case tok::kw___add_const:
case tok::kw___add_cv:
case tok::kw___add_volatile:
+ case tok::kw___remove_const:
case tok::annot_typename:
case tok::kw_char8_t:
case tok::kw_char16_t:
Index: clang/lib/AST/TypePrinter.cpp
===================================================================
--- clang/lib/AST/TypePrinter.cpp
+++ clang/lib/AST/TypePrinter.cpp
@@ -1122,9 +1122,11 @@
case UnaryTransformType::EnumUnderlyingType:
case UnaryTransformType::AddConst:
case UnaryTransformType::AddCV:
+ case UnaryTransformType::RemoveConst:
case UnaryTransformType::AddVolatile: {
- constexpr std::array<const char *, 4> Transformation = {
- "__underlying_type", "__add_const", "__add_cv", "__add_volatile"};
+ constexpr std::array<const char *, 5> Transformation = {
+ "__underlying_type", "__add_const", "__add_cv", "__add_volatile",
+ "__remove_const"};
OS << Transformation[T->getUTTKind()] << '(';
print(T->getBaseType(), OS, StringRef());
OS << ')';
@@ -1145,6 +1147,7 @@
case UnaryTransformType::AddConst:
case UnaryTransformType::AddCV:
case UnaryTransformType::AddVolatile:
+ case UnaryTransformType::RemoveConst:
return;
}
Index: clang/lib/AST/JSONNodeDumper.cpp
===================================================================
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -674,6 +674,9 @@
case UnaryTransformType::AddVolatile:
JOS.attribute("transformedKind", "add_volatile");
break;
+ case UnaryTransformType::RemoveConst:
+ JOS.attribute("transformedKind", "remove_const");
+ break;
}
}
Index: clang/lib/AST/ItaniumMangle.cpp
===================================================================
--- clang/lib/AST/ItaniumMangle.cpp
+++ clang/lib/AST/ItaniumMangle.cpp
@@ -3934,6 +3934,9 @@
case UnaryTransformType::AddVolatile:
Out << "3av";
break;
+ case UnaryTransformType::RemoveConst:
+ Out << "3rc";
+ break;
}
}
Index: clang/include/clang/Sema/DeclSpec.h
===================================================================
--- clang/include/clang/Sema/DeclSpec.h
+++ clang/include/clang/Sema/DeclSpec.h
@@ -294,6 +294,7 @@
static const TST TST_add_const = clang::TST_add_const;
static const TST TST_add_cv = clang::TST_add_cv;
static const TST TST_add_volatile = clang::TST_add_volatile;
+ static const TST TST_remove_const = clang::TST_remove_const;
static const TST TST_auto = clang::TST_auto;
static const TST TST_auto_type = clang::TST_auto_type;
static const TST TST_unknown_anytype = clang::TST_unknown_anytype;
Index: clang/include/clang/Basic/TokenKinds.def
===================================================================
--- clang/include/clang/Basic/TokenKinds.def
+++ clang/include/clang/Basic/TokenKinds.def
@@ -511,6 +511,7 @@
KEYWORD(__add_const, KEYCXX)
KEYWORD(__add_cv, KEYCXX)
KEYWORD(__add_volatile, KEYCXX)
+KEYWORD(__remove_const, KEYCXX)
// Clang-only C++ Type Traits
TYPE_TRAIT_2(__reference_binds_to_temporary, ReferenceBindsToTemporary, KEYCXX)
Index: clang/include/clang/Basic/Specifiers.h
===================================================================
--- clang/include/clang/Basic/Specifiers.h
+++ clang/include/clang/Basic/Specifiers.h
@@ -86,6 +86,7 @@
TST_add_const, // __add_const extension
TST_add_cv, // __add_cv extension
TST_add_volatile, // __add_volatile extension
+ TST_remove_const, // __remove_const extension
TST_auto, // C++11 auto
TST_decltype_auto, // C++1y decltype(auto)
TST_auto_type, // __auto_type extension
Index: clang/include/clang/AST/Type.h
===================================================================
--- clang/include/clang/AST/Type.h
+++ clang/include/clang/AST/Type.h
@@ -4557,6 +4557,7 @@
AddCV,
AddConst,
AddVolatile,
+ RemoveConst,
};
private:
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits