forked from OSchip/llvm-project
Now that C++17 is official (https://www.iso.org/standard/68564.html), start changing the C++1z terminology over to C++17. NFC intended, these are all mechanical changes.
llvm-svn: 319688
This commit is contained in:
parent
800259c98d
commit
c351fba69e
|
@ -1473,7 +1473,7 @@ public:
|
|||
/// \brief C++11 deduction pattern for 'auto &&' type.
|
||||
QualType getAutoRRefDeductType() const;
|
||||
|
||||
/// \brief C++1z deduced class template specialization type.
|
||||
/// \brief C++17 deduced class template specialization type.
|
||||
QualType getDeducedTemplateSpecializationType(TemplateName Template,
|
||||
QualType DeducedType,
|
||||
bool IsDependent) const;
|
||||
|
|
|
@ -1487,10 +1487,10 @@ public:
|
|||
/// We resolve DR1361 by ignoring the second bullet. We resolve DR1452 by
|
||||
/// treating types with trivial default constructors as literal types.
|
||||
///
|
||||
/// Only in C++1z and beyond, are lambdas literal types.
|
||||
/// Only in C++17 and beyond, are lambdas literal types.
|
||||
bool isLiteral() const {
|
||||
return hasTrivialDestructor() &&
|
||||
(!isLambda() || getASTContext().getLangOpts().CPlusPlus1z) &&
|
||||
(!isLambda() || getASTContext().getLangOpts().CPlusPlus17) &&
|
||||
!hasNonLiteralTypeFieldsOrBases() &&
|
||||
(isAggregate() || isLambda() ||
|
||||
hasConstexprNonCopyMoveConstructor() ||
|
||||
|
|
|
@ -89,7 +89,7 @@ LANGOPT(Borland , 1, 0, "Borland extensions")
|
|||
LANGOPT(CPlusPlus , 1, 0, "C++")
|
||||
LANGOPT(CPlusPlus11 , 1, 0, "C++11")
|
||||
LANGOPT(CPlusPlus14 , 1, 0, "C++14")
|
||||
LANGOPT(CPlusPlus1z , 1, 0, "C++17")
|
||||
LANGOPT(CPlusPlus17 , 1, 0, "C++17")
|
||||
LANGOPT(CPlusPlus2a , 1, 0, "C++2a")
|
||||
LANGOPT(ObjC1 , 1, 0, "Objective-C 1")
|
||||
LANGOPT(ObjC2 , 1, 0, "Objective-C 2")
|
||||
|
|
|
@ -25,7 +25,7 @@ enum LangFeatures {
|
|||
CPlusPlus = (1 << 3),
|
||||
CPlusPlus11 = (1 << 4),
|
||||
CPlusPlus14 = (1 << 5),
|
||||
CPlusPlus1z = (1 << 6),
|
||||
CPlusPlus17 = (1 << 6),
|
||||
CPlusPlus2a = (1 << 7),
|
||||
Digraphs = (1 << 8),
|
||||
GNUMode = (1 << 9),
|
||||
|
@ -79,8 +79,8 @@ public:
|
|||
/// isCPlusPlus14 - Language is a C++14 variant (or later).
|
||||
bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; }
|
||||
|
||||
/// isCPlusPlus1z - Language is a C++17 variant (or later).
|
||||
bool isCPlusPlus1z() const { return Flags & frontend::CPlusPlus1z; }
|
||||
/// isCPlusPlus17 - Language is a C++17 variant (or later).
|
||||
bool isCPlusPlus17() const { return Flags & frontend::CPlusPlus17; }
|
||||
|
||||
/// isCPlusPlus2a - Language is a post-C++17 variant (or later).
|
||||
bool isCPlusPlus2a() const { return Flags & frontend::CPlusPlus2a; }
|
||||
|
|
|
@ -111,24 +111,24 @@ LANGSTANDARD_ALIAS_DEPR(gnucxx14, "gnu++1y")
|
|||
|
||||
LANGSTANDARD(cxx17, "c++17",
|
||||
CXX, "ISO C++ 2017 with amendments",
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
|
||||
Digraphs | HexFloat)
|
||||
LANGSTANDARD_ALIAS_DEPR(cxx17, "c++1z")
|
||||
|
||||
LANGSTANDARD(gnucxx17, "gnu++17",
|
||||
CXX, "ISO C++ 2017 with amendments and GNU extensions",
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
|
||||
Digraphs | HexFloat | GNUMode)
|
||||
LANGSTANDARD_ALIAS_DEPR(gnucxx17, "gnu++1z")
|
||||
|
||||
LANGSTANDARD(cxx2a, "c++2a",
|
||||
CXX, "Working draft for ISO C++ 2020",
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
|
||||
CPlusPlus2a | Digraphs | HexFloat)
|
||||
|
||||
LANGSTANDARD(gnucxx2a, "gnu++2a",
|
||||
CXX, "Working draft for ISO C++ 2020 with GNU extensions",
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
|
||||
CPlusPlus2a | Digraphs | HexFloat | GNUMode)
|
||||
|
||||
// OpenCL
|
||||
|
|
|
@ -2613,7 +2613,7 @@ static QualType getFunctionTypeWithExceptionSpec(
|
|||
bool ASTContext::hasSameFunctionTypeIgnoringExceptionSpec(QualType T,
|
||||
QualType U) {
|
||||
return hasSameType(T, U) ||
|
||||
(getLangOpts().CPlusPlus1z &&
|
||||
(getLangOpts().CPlusPlus17 &&
|
||||
hasSameType(getFunctionTypeWithExceptionSpec(*this, T, EST_None),
|
||||
getFunctionTypeWithExceptionSpec(*this, U, EST_None)));
|
||||
}
|
||||
|
@ -3477,7 +3477,7 @@ QualType ASTContext::getFunctionTypeInternal(
|
|||
Unique = true;
|
||||
}
|
||||
|
||||
bool NoexceptInType = getLangOpts().CPlusPlus1z;
|
||||
bool NoexceptInType = getLangOpts().CPlusPlus17;
|
||||
bool IsCanonicalExceptionSpec =
|
||||
isCanonicalExceptionSpecification(EPI.ExceptionSpec, NoexceptInType);
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
|
|||
C.Deallocate(data().getBases());
|
||||
|
||||
if (NumBases) {
|
||||
if (!C.getLangOpts().CPlusPlus1z) {
|
||||
if (!C.getLangOpts().CPlusPlus17) {
|
||||
// C++ [dcl.init.aggr]p1:
|
||||
// An aggregate is [...] a class with [...] no base classes [...].
|
||||
data().Aggregate = false;
|
||||
|
|
|
@ -599,7 +599,7 @@ protected:
|
|||
Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
|
||||
|
||||
if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
|
||||
if (Opts.CPlusPlus1z)
|
||||
if (Opts.CPlusPlus17)
|
||||
Builder.defineMacro("_MSVC_LANG", "201403L");
|
||||
else if (Opts.CPlusPlus14)
|
||||
Builder.defineMacro("_MSVC_LANG", "201402L");
|
||||
|
|
|
@ -2073,7 +2073,7 @@ LangOptions getFormattingLangOpts(const FormatStyle &Style) {
|
|||
LangOpts.CPlusPlus = 1;
|
||||
LangOpts.CPlusPlus11 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
|
||||
LangOpts.CPlusPlus14 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
|
||||
LangOpts.CPlusPlus1z = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
|
||||
LangOpts.CPlusPlus17 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
|
||||
LangOpts.LineComment = 1;
|
||||
bool AlternativeOperators = Style.isCpp();
|
||||
LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0;
|
||||
|
|
|
@ -1748,7 +1748,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
|||
Opts.CPlusPlus = Std.isCPlusPlus();
|
||||
Opts.CPlusPlus11 = Std.isCPlusPlus11();
|
||||
Opts.CPlusPlus14 = Std.isCPlusPlus14();
|
||||
Opts.CPlusPlus1z = Std.isCPlusPlus1z();
|
||||
Opts.CPlusPlus17 = Std.isCPlusPlus17();
|
||||
Opts.CPlusPlus2a = Std.isCPlusPlus2a();
|
||||
Opts.Digraphs = Std.hasDigraphs();
|
||||
Opts.GNUMode = Std.isGNUMode();
|
||||
|
@ -1804,7 +1804,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
|||
Opts.GNUKeywords = Opts.GNUMode;
|
||||
Opts.CXXOperatorNames = Opts.CPlusPlus;
|
||||
|
||||
Opts.AlignedAllocation = Opts.CPlusPlus1z;
|
||||
Opts.AlignedAllocation = Opts.CPlusPlus17;
|
||||
|
||||
Opts.DollarIdents = !Opts.AsmPreprocessor;
|
||||
}
|
||||
|
@ -2123,7 +2123,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
// Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
|
||||
// is specified, or -std is set to a conforming mode.
|
||||
// Trigraphs are disabled by default in c++1z onwards.
|
||||
Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z;
|
||||
Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17;
|
||||
Opts.Trigraphs =
|
||||
Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
|
||||
|
||||
|
|
|
@ -383,7 +383,7 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
|
|||
// C++17 [cpp.predefined]p1:
|
||||
// The name __cplusplus is defined to the value 201703L when compiling a
|
||||
// C++ translation unit.
|
||||
else if (LangOpts.CPlusPlus1z)
|
||||
else if (LangOpts.CPlusPlus17)
|
||||
Builder.defineMacro("__cplusplus", "201703L");
|
||||
// C++1y [cpp.predefined]p1:
|
||||
// The name __cplusplus is defined to the value 201402L when compiling a
|
||||
|
@ -483,12 +483,12 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
|
|||
Builder.defineMacro("__cpp_user_defined_literals", "200809");
|
||||
Builder.defineMacro("__cpp_lambdas", "200907");
|
||||
Builder.defineMacro("__cpp_constexpr",
|
||||
LangOpts.CPlusPlus1z ? "201603" :
|
||||
LangOpts.CPlusPlus17 ? "201603" :
|
||||
LangOpts.CPlusPlus14 ? "201304" : "200704");
|
||||
Builder.defineMacro("__cpp_range_based_for",
|
||||
LangOpts.CPlusPlus1z ? "201603" : "200907");
|
||||
LangOpts.CPlusPlus17 ? "201603" : "200907");
|
||||
Builder.defineMacro("__cpp_static_assert",
|
||||
LangOpts.CPlusPlus1z ? "201411" : "200410");
|
||||
LangOpts.CPlusPlus17 ? "201411" : "200410");
|
||||
Builder.defineMacro("__cpp_decltype", "200707");
|
||||
Builder.defineMacro("__cpp_attributes", "200809");
|
||||
Builder.defineMacro("__cpp_rvalue_references", "200610");
|
||||
|
@ -518,7 +518,7 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
|
|||
Builder.defineMacro("__cpp_sized_deallocation", "201309");
|
||||
|
||||
// C++17 features.
|
||||
if (LangOpts.CPlusPlus1z) {
|
||||
if (LangOpts.CPlusPlus17) {
|
||||
Builder.defineMacro("__cpp_hex_float", "201603");
|
||||
Builder.defineMacro("__cpp_inline_variables", "201606");
|
||||
Builder.defineMacro("__cpp_noexcept_function_type", "201510");
|
||||
|
|
|
@ -1649,7 +1649,7 @@ bool Lexer::LexNumericConstant(Token &Result, const char *CurPtr) {
|
|||
if (!LangOpts.C99) {
|
||||
if (!isHexaLiteral(BufferPtr, LangOpts))
|
||||
IsHexFloat = false;
|
||||
else if (!getLangOpts().CPlusPlus1z &&
|
||||
else if (!getLangOpts().CPlusPlus17 &&
|
||||
std::find(BufferPtr, CurPtr, '_') != CurPtr)
|
||||
IsHexFloat = false;
|
||||
}
|
||||
|
@ -3178,7 +3178,7 @@ LexNextToken:
|
|||
ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result),
|
||||
SizeTmp2, Result),
|
||||
tok::utf8_string_literal);
|
||||
if (Char2 == '\'' && LangOpts.CPlusPlus1z)
|
||||
if (Char2 == '\'' && LangOpts.CPlusPlus17)
|
||||
return LexCharConstant(
|
||||
Result, ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result),
|
||||
SizeTmp2, Result),
|
||||
|
|
|
@ -855,7 +855,7 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
|
|||
PP.Diag(TokLoc, PP.getLangOpts().CPlusPlus
|
||||
? diag::ext_hex_literal_invalid
|
||||
: diag::ext_hex_constant_invalid);
|
||||
else if (PP.getLangOpts().CPlusPlus1z)
|
||||
else if (PP.getLangOpts().CPlusPlus17)
|
||||
PP.Diag(TokLoc, diag::warn_cxx17_hex_literal);
|
||||
} else if (saw_period) {
|
||||
PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s - ThisTokBegin),
|
||||
|
|
|
@ -99,8 +99,8 @@ TokenConcatenation::TokenConcatenation(Preprocessor &pp) : PP(pp) {
|
|||
TokenInfo[tok::utf32_char_constant ] |= aci_custom;
|
||||
}
|
||||
|
||||
// These tokens have custom code in C++1z mode.
|
||||
if (PP.getLangOpts().CPlusPlus1z)
|
||||
// These tokens have custom code in C++17 mode.
|
||||
if (PP.getLangOpts().CPlusPlus17)
|
||||
TokenInfo[tok::utf8_char_constant] |= aci_custom;
|
||||
|
||||
// These tokens have custom code in C++2a mode.
|
||||
|
|
|
@ -3228,7 +3228,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
|
|||
|
||||
// Likewise, if this is a context where the identifier could be a template
|
||||
// name, check whether this is a deduction guide declaration.
|
||||
if (getLangOpts().CPlusPlus1z &&
|
||||
if (getLangOpts().CPlusPlus17 &&
|
||||
(DSContext == DSC_class || DSContext == DSC_top_level) &&
|
||||
Actions.isDeductionGuideName(getCurScope(), *Tok.getIdentifierInfo(),
|
||||
Tok.getLocation()) &&
|
||||
|
@ -4420,7 +4420,7 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {
|
|||
ProhibitAttributes(attrs); // GNU-style attributes are prohibited.
|
||||
if (standardAttributesAllowed() && isCXX11AttributeSpecifier()) {
|
||||
if (getLangOpts().CPlusPlus)
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_ns_enum_attribute
|
||||
: diag::ext_ns_enum_attribute)
|
||||
<< 1 /*enumerator*/;
|
||||
|
|
|
@ -77,7 +77,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context,
|
|||
ParsedAttributesWithRange attrs(AttrFactory);
|
||||
SourceLocation attrLoc;
|
||||
if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_ns_enum_attribute
|
||||
: diag::ext_ns_enum_attribute)
|
||||
<< 0 /*namespace*/;
|
||||
|
@ -142,7 +142,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context,
|
|||
// Normal namespace definition, not a nested-namespace-definition.
|
||||
} else if (InlineLoc.isValid()) {
|
||||
Diag(InlineLoc, diag::err_inline_nested_namespace_definition);
|
||||
} else if (getLangOpts().CPlusPlus1z) {
|
||||
} else if (getLangOpts().CPlusPlus17) {
|
||||
Diag(ExtraNamespaceLoc[0],
|
||||
diag::warn_cxx14_compat_nested_namespace_definition);
|
||||
} else {
|
||||
|
@ -605,7 +605,7 @@ bool Parser::ParseUsingDeclarator(unsigned Context, UsingDeclarator &D) {
|
|||
}
|
||||
|
||||
if (TryConsumeToken(tok::ellipsis, D.EllipsisLoc))
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z ?
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ?
|
||||
diag::warn_cxx17_compat_using_declaration_pack :
|
||||
diag::ext_using_declaration_pack);
|
||||
|
||||
|
@ -723,7 +723,7 @@ Parser::ParseUsingDeclaration(unsigned Context,
|
|||
}
|
||||
|
||||
if (DeclsInGroup.size() > 1)
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z ?
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ?
|
||||
diag::warn_cxx17_compat_multi_using_declaration :
|
||||
diag::ext_multi_using_declaration);
|
||||
|
||||
|
@ -851,10 +851,10 @@ Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){
|
|||
|
||||
ExprResult AssertMessage;
|
||||
if (Tok.is(tok::r_paren)) {
|
||||
Diag(Tok, getLangOpts().CPlusPlus1z
|
||||
Diag(Tok, getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_static_assert_no_message
|
||||
: diag::ext_static_assert_no_message)
|
||||
<< (getLangOpts().CPlusPlus1z
|
||||
<< (getLangOpts().CPlusPlus17
|
||||
? FixItHint()
|
||||
: FixItHint::CreateInsertion(Tok.getLocation(), ", \"\""));
|
||||
} else {
|
||||
|
@ -3625,7 +3625,7 @@ static void diagnoseDynamicExceptionSpecification(
|
|||
if (P.getLangOpts().CPlusPlus11) {
|
||||
const char *Replacement = IsNoexcept ? "noexcept" : "noexcept(false)";
|
||||
P.Diag(Range.getBegin(),
|
||||
P.getLangOpts().CPlusPlus1z && !IsNoexcept
|
||||
P.getLangOpts().CPlusPlus17 && !IsNoexcept
|
||||
? diag::ext_dynamic_exception_spec
|
||||
: diag::warn_exception_spec_deprecated)
|
||||
<< Range;
|
||||
|
@ -3956,7 +3956,7 @@ void Parser::ParseCXX11AttributeSpecifier(ParsedAttributes &attrs,
|
|||
SourceLocation CommonScopeLoc;
|
||||
IdentifierInfo *CommonScopeName = nullptr;
|
||||
if (Tok.is(tok::kw_using)) {
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_using_attribute_ns
|
||||
: diag::ext_using_attribute_ns);
|
||||
ConsumeToken();
|
||||
|
|
|
@ -2733,7 +2733,7 @@ ExprResult Parser::ParseFoldExpression(ExprResult LHS,
|
|||
}
|
||||
}
|
||||
|
||||
Diag(EllipsisLoc, getLangOpts().CPlusPlus1z
|
||||
Diag(EllipsisLoc, getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_fold_expression
|
||||
: diag::ext_fold_expression);
|
||||
|
||||
|
|
|
@ -1062,7 +1062,7 @@ static void
|
|||
addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc,
|
||||
DeclSpec &DS) {
|
||||
if (ConstexprLoc.isValid()) {
|
||||
P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus1z
|
||||
P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus17
|
||||
? diag::ext_constexpr_on_lambda_cxx17
|
||||
: diag::warn_cxx14_compat_constexpr_on_lambda);
|
||||
const char *PrevSpec = nullptr;
|
||||
|
@ -1760,7 +1760,7 @@ Sema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt,
|
|||
}
|
||||
|
||||
case ConditionOrInitStatement::InitStmtDecl: {
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_init_statement
|
||||
: diag::ext_init_statement)
|
||||
<< (CK == Sema::ConditionKind::Switch);
|
||||
|
@ -2480,7 +2480,7 @@ bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
|
|||
/*IsCtorOrDtorName=*/true,
|
||||
/*NonTrivialTypeSourceInfo=*/true);
|
||||
Result.setConstructorName(Ty, IdLoc, IdLoc);
|
||||
} else if (getLangOpts().CPlusPlus1z &&
|
||||
} else if (getLangOpts().CPlusPlus17 &&
|
||||
AllowDeductionGuide && SS.isEmpty() &&
|
||||
Actions.isDeductionGuideName(getCurScope(), *Id, IdLoc,
|
||||
&TemplateName)) {
|
||||
|
|
|
@ -1128,7 +1128,7 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
|
|||
|
||||
bool IsConstexpr = false;
|
||||
if (Tok.is(tok::kw_constexpr)) {
|
||||
Diag(Tok, getLangOpts().CPlusPlus1z ? diag::warn_cxx14_compat_constexpr_if
|
||||
Diag(Tok, getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_constexpr_if
|
||||
: diag::ext_constexpr_if);
|
||||
IsConstexpr = true;
|
||||
ConsumeToken();
|
||||
|
@ -1613,7 +1613,7 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {
|
|||
ForRangeInit.RangeExpr = ParseExpression();
|
||||
|
||||
Diag(Loc, diag::err_for_range_identifier)
|
||||
<< ((getLangOpts().CPlusPlus11 && !getLangOpts().CPlusPlus1z)
|
||||
<< ((getLangOpts().CPlusPlus11 && !getLangOpts().CPlusPlus17)
|
||||
? FixItHint::CreateInsertion(Loc, "auto &&")
|
||||
: FixItHint());
|
||||
|
||||
|
|
|
@ -590,10 +590,10 @@ Parser::ParseTemplateTemplateParameter(unsigned Depth, unsigned Position) {
|
|||
const Token &Next = Tok.is(tok::kw_struct) ? NextToken() : Tok;
|
||||
if (Tok.is(tok::kw_typename)) {
|
||||
Diag(Tok.getLocation(),
|
||||
getLangOpts().CPlusPlus1z
|
||||
getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_template_template_param_typename
|
||||
: diag::ext_template_template_param_typename)
|
||||
<< (!getLangOpts().CPlusPlus1z
|
||||
<< (!getLangOpts().CPlusPlus17
|
||||
? FixItHint::CreateReplacement(Tok.getLocation(), "class")
|
||||
: FixItHint());
|
||||
} else if (Next.isOneOf(tok::identifier, tok::comma, tok::greater,
|
||||
|
|
|
@ -1275,7 +1275,7 @@ static StringRef getFallthroughAttrSpelling(Preprocessor &PP,
|
|||
tok::r_square, tok::r_square
|
||||
};
|
||||
|
||||
bool PreferClangAttr = !PP.getLangOpts().CPlusPlus1z;
|
||||
bool PreferClangAttr = !PP.getLangOpts().CPlusPlus17;
|
||||
|
||||
StringRef MacroName;
|
||||
if (PreferClangAttr)
|
||||
|
|
|
@ -281,7 +281,7 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
|
|||
IdentifierInfo **CorrectedII) {
|
||||
// FIXME: Consider allowing this outside C++1z mode as an extension.
|
||||
bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
|
||||
getLangOpts().CPlusPlus1z && !IsCtorOrDtorName &&
|
||||
getLangOpts().CPlusPlus17 && !IsCtorOrDtorName &&
|
||||
!isClassName && !HasTrailingDot;
|
||||
|
||||
// Determine where we will perform name lookup.
|
||||
|
@ -4199,7 +4199,7 @@ Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS,
|
|||
|
||||
if (DS.isInlineSpecified())
|
||||
Diag(DS.getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
|
||||
if (DS.isConstexprSpecified()) {
|
||||
// C++0x [dcl.constexpr]p1: constexpr can only be applied to declarations
|
||||
|
@ -5690,7 +5690,7 @@ Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
|||
|
||||
if (D.getDeclSpec().isInlineSpecified())
|
||||
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
if (D.getDeclSpec().isConstexprSpecified())
|
||||
Diag(D.getDeclSpec().getConstexprSpecLoc(), diag::err_invalid_constexpr)
|
||||
<< 1;
|
||||
|
@ -6362,7 +6362,7 @@ NamedDecl *Sema::ActOnVariableDeclarator(
|
|||
// Suppress the warning in system macros, it's used in macros in some
|
||||
// popular C system headers, such as in glibc's htonl() macro.
|
||||
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
|
||||
getLangOpts().CPlusPlus1z ? diag::ext_register_storage_class
|
||||
getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class
|
||||
: diag::warn_deprecated_register)
|
||||
<< FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
|
||||
}
|
||||
|
@ -6550,7 +6550,7 @@ NamedDecl *Sema::ActOnVariableDeclarator(
|
|||
// C++1z [dcl.spec.constexpr]p1:
|
||||
// A static data member declared with the constexpr specifier is
|
||||
// implicitly an inline variable.
|
||||
if (NewVD->isStaticDataMember() && getLangOpts().CPlusPlus1z)
|
||||
if (NewVD->isStaticDataMember() && getLangOpts().CPlusPlus17)
|
||||
NewVD->setImplicitlyInline();
|
||||
}
|
||||
|
||||
|
@ -6606,7 +6606,7 @@ NamedDecl *Sema::ActOnVariableDeclarator(
|
|||
<< FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
|
||||
} else {
|
||||
Diag(D.getDeclSpec().getInlineSpecLoc(),
|
||||
getLangOpts().CPlusPlus1z ? diag::warn_cxx14_compat_inline_variable
|
||||
getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_inline_variable
|
||||
: diag::ext_inline_variable);
|
||||
NewVD->setInlineSpecified();
|
||||
}
|
||||
|
@ -9601,7 +9601,7 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
|
|||
// return type. (Exception specifications on the function itself are OK in
|
||||
// most cases, and exception specifications are not permitted in most other
|
||||
// contexts where they could make it into a mangling.)
|
||||
if (!getLangOpts().CPlusPlus1z && !NewFD->getPrimaryTemplate()) {
|
||||
if (!getLangOpts().CPlusPlus17 && !NewFD->getPrimaryTemplate()) {
|
||||
auto HasNoexcept = [&](QualType T) -> bool {
|
||||
// Strip off declarator chunks that could be between us and a function
|
||||
// type. We don't need to look far, exception specifications are very
|
||||
|
@ -10811,7 +10811,7 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) {
|
|||
if (Var->isStaticDataMember()) {
|
||||
// C++1z removes the relevant rule; the in-class declaration is always
|
||||
// a definition there.
|
||||
if (!getLangOpts().CPlusPlus1z) {
|
||||
if (!getLangOpts().CPlusPlus17) {
|
||||
Diag(Var->getLocation(),
|
||||
diag::err_constexpr_static_mem_var_requires_init)
|
||||
<< Var->getDeclName();
|
||||
|
@ -11729,7 +11729,7 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
// In C++17, it is not allowed, but we tolerate it as an extension.
|
||||
if (getLangOpts().CPlusPlus11) {
|
||||
Diag(DS.getStorageClassSpecLoc(),
|
||||
getLangOpts().CPlusPlus1z ? diag::ext_register_storage_class
|
||||
getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class
|
||||
: diag::warn_deprecated_register)
|
||||
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
|
||||
}
|
||||
|
@ -11747,7 +11747,7 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
<< DeclSpec::getSpecifierName(TSCS);
|
||||
if (DS.isInlineSpecified())
|
||||
Diag(DS.getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
if (DS.isConstexprSpecified())
|
||||
Diag(DS.getConstexprSpecLoc(), diag::err_invalid_constexpr)
|
||||
<< 0;
|
||||
|
@ -14491,7 +14491,7 @@ FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record,
|
|||
|
||||
if (D.getDeclSpec().isInlineSpecified())
|
||||
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_invalid_thread)
|
||||
|
|
|
@ -2152,10 +2152,10 @@ static void handleUsedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
}
|
||||
|
||||
static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
||||
bool IsCXX1zAttr = Attr.isCXX11Attribute() && !Attr.getScopeName();
|
||||
bool IsCXX17Attr = Attr.isCXX11Attribute() && !Attr.getScopeName();
|
||||
|
||||
if (IsCXX1zAttr && isa<VarDecl>(D)) {
|
||||
// The C++1z spelling of this attribute cannot be applied to a static data
|
||||
if (IsCXX17Attr && isa<VarDecl>(D)) {
|
||||
// The C++17 spelling of this attribute cannot be applied to a static data
|
||||
// member per [dcl.attr.unused]p2.
|
||||
if (cast<VarDecl>(D)->isStaticDataMember()) {
|
||||
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
|
||||
|
@ -2164,9 +2164,9 @@ static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
}
|
||||
}
|
||||
|
||||
// If this is spelled as the standard C++1z attribute, but not in C++1z, warn
|
||||
// If this is spelled as the standard C++17 attribute, but not in C++17, warn
|
||||
// about using it as an extension.
|
||||
if (!S.getLangOpts().CPlusPlus1z && IsCXX1zAttr)
|
||||
if (!S.getLangOpts().CPlusPlus17 && IsCXX17Attr)
|
||||
S.Diag(Attr.getLoc(), diag::ext_cxx17_attr) << Attr.getName();
|
||||
|
||||
D->addAttr(::new (S.Context) UnusedAttr(
|
||||
|
@ -2861,9 +2861,9 @@ static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr)
|
|||
return;
|
||||
}
|
||||
|
||||
// If this is spelled as the standard C++1z attribute, but not in C++1z, warn
|
||||
// If this is spelled as the standard C++17 attribute, but not in C++17, warn
|
||||
// about using it as an extension.
|
||||
if (!S.getLangOpts().CPlusPlus1z && Attr.isCXX11Attribute() &&
|
||||
if (!S.getLangOpts().CPlusPlus17 && Attr.isCXX11Attribute() &&
|
||||
!Attr.getScopeName())
|
||||
S.Diag(Attr.getLoc(), diag::ext_cxx17_attr) << Attr.getName();
|
||||
|
||||
|
|
|
@ -708,7 +708,7 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Diag(Decomp.getLSquareLoc(), getLangOpts().CPlusPlus1z
|
||||
Diag(Decomp.getLSquareLoc(), getLangOpts().CPlusPlus17
|
||||
? diag::warn_cxx14_compat_decomp_decl
|
||||
: diag::ext_decomp_decl)
|
||||
<< Decomp.getSourceRange();
|
||||
|
@ -15018,7 +15018,7 @@ MSPropertyDecl *Sema::HandleMSProperty(Scope *S, RecordDecl *Record,
|
|||
|
||||
if (D.getDeclSpec().isInlineSpecified())
|
||||
Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_invalid_thread)
|
||||
|
|
|
@ -4846,7 +4846,7 @@ Decl *Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {
|
|||
}
|
||||
if (DS.isInlineSpecified())
|
||||
Diag(DS.getInlineSpecLoc(), diag::err_inline_non_function)
|
||||
<< getLangOpts().CPlusPlus1z;
|
||||
<< getLangOpts().CPlusPlus17;
|
||||
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_invalid_thread)
|
||||
|
|
|
@ -145,7 +145,7 @@ bool Sema::CheckSpecifiedExceptionType(QualType &T, SourceRange Range) {
|
|||
bool Sema::CheckDistantExceptionSpec(QualType T) {
|
||||
// C++17 removes this rule in favor of putting exception specifications into
|
||||
// the type system.
|
||||
if (getLangOpts().CPlusPlus1z)
|
||||
if (getLangOpts().CPlusPlus17)
|
||||
return false;
|
||||
|
||||
if (const PointerType *PT = T->getAs<PointerType>())
|
||||
|
@ -237,10 +237,10 @@ static bool hasImplicitExceptionSpec(FunctionDecl *Decl) {
|
|||
}
|
||||
|
||||
bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
|
||||
// Just completely ignore this under -fno-exceptions prior to C++1z.
|
||||
// In C++1z onwards, the exception specification is part of the type and
|
||||
// Just completely ignore this under -fno-exceptions prior to C++17.
|
||||
// In C++17 onwards, the exception specification is part of the type and
|
||||
// we will diagnose mismatches anyway, so it's better to check for them here.
|
||||
if (!getLangOpts().CXXExceptions && !getLangOpts().CPlusPlus1z)
|
||||
if (!getLangOpts().CXXExceptions && !getLangOpts().CPlusPlus17)
|
||||
return false;
|
||||
|
||||
OverloadedOperatorKind OO = New->getDeclName().getCXXOverloadedOperator();
|
||||
|
@ -872,7 +872,7 @@ bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) {
|
|||
// This is not an error in C++17 onwards, unless the noexceptness doesn't
|
||||
// match, but in that case we have a full-on type mismatch, not just a
|
||||
// type sugar mismatch.
|
||||
if (getLangOpts().CPlusPlus1z) {
|
||||
if (getLangOpts().CPlusPlus17) {
|
||||
DiagID = diag::warn_incompatible_exception_specs;
|
||||
NestedDiagID = diag::warn_deep_exception_specs_differ;
|
||||
}
|
||||
|
@ -892,7 +892,7 @@ bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) {
|
|||
return CheckExceptionSpecSubset(PDiag(DiagID), PDiag(NestedDiagID), PDiag(),
|
||||
ToFunc, From->getSourceRange().getBegin(),
|
||||
FromFunc, SourceLocation()) &&
|
||||
!getLangOpts().CPlusPlus1z;
|
||||
!getLangOpts().CPlusPlus17;
|
||||
}
|
||||
|
||||
bool Sema::CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New,
|
||||
|
@ -953,7 +953,7 @@ static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D) {
|
|||
QualType T;
|
||||
|
||||
// In C++1z, just look at the function type of the callee.
|
||||
if (S.getLangOpts().CPlusPlus1z && isa<CallExpr>(E)) {
|
||||
if (S.getLangOpts().CPlusPlus17 && isa<CallExpr>(E)) {
|
||||
E = cast<CallExpr>(E)->getCallee();
|
||||
T = E->getType();
|
||||
if (T->isSpecificPlaceholderType(BuiltinType::BoundMember)) {
|
||||
|
|
|
@ -10919,7 +10919,7 @@ static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
|
|||
return QualType();
|
||||
}
|
||||
// Increment of bool sets it to true, but is deprecated.
|
||||
S.Diag(OpLoc, S.getLangOpts().CPlusPlus1z ? diag::ext_increment_bool
|
||||
S.Diag(OpLoc, S.getLangOpts().CPlusPlus17 ? diag::ext_increment_bool
|
||||
: diag::warn_increment_bool)
|
||||
<< Op->getSourceRange();
|
||||
} else if (S.getLangOpts().CPlusPlus && ResType->isEnumeralType()) {
|
||||
|
@ -13735,7 +13735,7 @@ void Sema::PopExpressionEvaluationContext() {
|
|||
// are part of function-signatures. Be mindful that P0315 (Lambdas in
|
||||
// unevaluated contexts) might lift some of these restrictions in a
|
||||
// future version.
|
||||
if (!Rec.isConstantEvaluated() || !getLangOpts().CPlusPlus1z)
|
||||
if (!Rec.isConstantEvaluated() || !getLangOpts().CPlusPlus17)
|
||||
for (const auto *L : Rec.Lambdas)
|
||||
Diag(L->getLocStart(), D);
|
||||
} else {
|
||||
|
|
|
@ -5750,7 +5750,7 @@ mergeExceptionSpecs(Sema &S, FunctionProtoType::ExceptionSpecInfo ESI1,
|
|||
// happen in C++17, because it would mean we were computing the composite
|
||||
// pointer type of dependent types, which should never happen.
|
||||
if (EST1 == EST_ComputedNoexcept || EST2 == EST_ComputedNoexcept) {
|
||||
assert(!S.getLangOpts().CPlusPlus1z &&
|
||||
assert(!S.getLangOpts().CPlusPlus17 &&
|
||||
"computing composite pointer type of dependent types");
|
||||
return FunctionProtoType::ExceptionSpecInfo();
|
||||
}
|
||||
|
|
|
@ -3631,7 +3631,7 @@ ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc,
|
|||
//
|
||||
// Note: SecondStepOfCopyInit is only ever true in this case when
|
||||
// evaluating whether to produce a C++98 compatibility warning.
|
||||
if (S.getLangOpts().CPlusPlus1z && Args.size() == 1 &&
|
||||
if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
|
||||
!SecondStepOfCopyInit) {
|
||||
Expr *Initializer = Args[0];
|
||||
auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
|
||||
|
@ -3701,7 +3701,7 @@ static void TryConstructorInitialization(Sema &S,
|
|||
return;
|
||||
}
|
||||
|
||||
// C++1z [dcl.init]p17:
|
||||
// C++17 [dcl.init]p17:
|
||||
// - If the initializer expression is a prvalue and the cv-unqualified
|
||||
// version of the source type is the same class as the class of the
|
||||
// destination, the initializer expression is used to initialize the
|
||||
|
@ -3710,7 +3710,7 @@ static void TryConstructorInitialization(Sema &S,
|
|||
// class or delegating to another constructor from a mem-initializer.
|
||||
// ObjC++: Lambda captured by the block in the lambda to block conversion
|
||||
// should avoid copy elision.
|
||||
if (S.getLangOpts().CPlusPlus1z &&
|
||||
if (S.getLangOpts().CPlusPlus17 &&
|
||||
Entity.getKind() != InitializedEntity::EK_Base &&
|
||||
Entity.getKind() != InitializedEntity::EK_Delegating &&
|
||||
Entity.getKind() !=
|
||||
|
@ -4078,7 +4078,7 @@ static void TryListInitialization(Sema &S,
|
|||
// value T(v); if a narrowing conversion is required to convert v to
|
||||
// the underlying type of T, the program is ill-formed.
|
||||
auto *ET = DestType->getAs<EnumType>();
|
||||
if (S.getLangOpts().CPlusPlus1z &&
|
||||
if (S.getLangOpts().CPlusPlus17 &&
|
||||
Kind.getKind() == InitializationKind::IK_DirectList &&
|
||||
ET && ET->getDecl()->isFixed() &&
|
||||
!S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
|
||||
|
@ -4511,7 +4511,7 @@ static void TryReferenceInitializationCore(Sema &S,
|
|||
RefRelationship == Sema::Ref_Related)) &&
|
||||
((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
|
||||
(InitCategory.isPRValue() &&
|
||||
(S.getLangOpts().CPlusPlus1z || T2->isRecordType() ||
|
||||
(S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
|
||||
T2->isArrayType())))) {
|
||||
ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_RValue;
|
||||
if (InitCategory.isPRValue() && T2->isRecordType()) {
|
||||
|
@ -4887,7 +4887,7 @@ static void TryUserDefinedConversion(Sema &S,
|
|||
// copy-initialization.
|
||||
// Note that this just performs a simple object copy from the temporary.
|
||||
//
|
||||
// C++1z:
|
||||
// C++17:
|
||||
// - if the function is a constructor, the call is a prvalue of the
|
||||
// cv-unqualified version of the destination type whose return object
|
||||
// is initialized by the constructor. The call is used to
|
||||
|
@ -4896,7 +4896,7 @@ static void TryUserDefinedConversion(Sema &S,
|
|||
// Therefore we need to do nothing further.
|
||||
//
|
||||
// FIXME: Mark this copy as extraneous.
|
||||
if (!S.getLangOpts().CPlusPlus1z)
|
||||
if (!S.getLangOpts().CPlusPlus17)
|
||||
Sequence.AddFinalCopy(DestType);
|
||||
else if (DestType.hasQualifiers())
|
||||
Sequence.AddQualificationConversionStep(DestType, VK_RValue);
|
||||
|
@ -4912,13 +4912,13 @@ static void TryUserDefinedConversion(Sema &S,
|
|||
// The call is used to direct-initialize [...] the object that is the
|
||||
// destination of the copy-initialization.
|
||||
//
|
||||
// In C++1z, this does not call a constructor if we enter /17.6.1:
|
||||
// In C++17, this does not call a constructor if we enter /17.6.1:
|
||||
// - If the initializer expression is a prvalue and the cv-unqualified
|
||||
// version of the source type is the same as the class of the
|
||||
// destination [... do not make an extra copy]
|
||||
//
|
||||
// FIXME: Mark this copy as extraneous.
|
||||
if (!S.getLangOpts().CPlusPlus1z ||
|
||||
if (!S.getLangOpts().CPlusPlus17 ||
|
||||
Function->getReturnType()->isReferenceType() ||
|
||||
!S.Context.hasSameUnqualifiedType(ConvType, DestType))
|
||||
Sequence.AddFinalCopy(DestType);
|
||||
|
|
|
@ -947,7 +947,7 @@ void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
|
|||
PrevCaptureLoc = C->Loc, ++C) {
|
||||
if (C->Kind == LCK_This || C->Kind == LCK_StarThis) {
|
||||
if (C->Kind == LCK_StarThis)
|
||||
Diag(C->Loc, !getLangOpts().CPlusPlus1z
|
||||
Diag(C->Loc, !getLangOpts().CPlusPlus17
|
||||
? diag::ext_star_this_lambda_capture_cxx17
|
||||
: diag::warn_cxx14_compat_star_this_lambda_capture);
|
||||
|
||||
|
@ -1288,7 +1288,7 @@ static void addFunctionPointerConversion(Sema &S,
|
|||
ConvTy,
|
||||
ConvTSI,
|
||||
/*isInline=*/true, /*isExplicit=*/false,
|
||||
/*isConstexpr=*/S.getLangOpts().CPlusPlus1z,
|
||||
/*isConstexpr=*/S.getLangOpts().CPlusPlus17,
|
||||
CallOperator->getBody()->getLocEnd());
|
||||
Conversion->setAccess(AS_public);
|
||||
Conversion->setImplicit(true);
|
||||
|
@ -1608,7 +1608,7 @@ ExprResult Sema::BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
|
|||
// If the lambda expression's call operator is not explicitly marked constexpr
|
||||
// and we are not in a dependent context, analyze the call operator to infer
|
||||
// its constexpr-ness, suppressing diagnostics while doing so.
|
||||
if (getLangOpts().CPlusPlus1z && !CallOperator->isInvalidDecl() &&
|
||||
if (getLangOpts().CPlusPlus17 && !CallOperator->isInvalidDecl() &&
|
||||
!CallOperator->isConstexpr() &&
|
||||
!isa<CoroutineBodyStmt>(CallOperator->getBody()) &&
|
||||
!Class->getDeclContext()->isDependentContext()) {
|
||||
|
|
|
@ -10699,7 +10699,7 @@ static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc,
|
|||
return true;
|
||||
|
||||
auto *FPT = FD->getType()->castAs<FunctionProtoType>();
|
||||
if (S.getLangOpts().CPlusPlus1z &&
|
||||
if (S.getLangOpts().CPlusPlus17 &&
|
||||
isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
|
||||
!S.ResolveExceptionSpec(Loc, FPT))
|
||||
return true;
|
||||
|
|
|
@ -2480,7 +2480,7 @@ Sema::BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc,
|
|||
// C++1z removes this restriction.
|
||||
QualType BeginType = BeginVar->getType(), EndType = EndVar->getType();
|
||||
if (!Context.hasSameType(BeginType, EndType)) {
|
||||
Diag(RangeLoc, getLangOpts().CPlusPlus1z
|
||||
Diag(RangeLoc, getLangOpts().CPlusPlus17
|
||||
? diag::warn_for_range_begin_end_types_differ
|
||||
: diag::ext_for_range_begin_end_types_differ)
|
||||
<< BeginType << EndType;
|
||||
|
|
|
@ -43,9 +43,9 @@ static Attr *handleFallThroughAttr(Sema &S, Stmt *St, const AttributeList &A,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// If this is spelled as the standard C++1z attribute, but not in C++1z, warn
|
||||
// If this is spelled as the standard C++17 attribute, but not in C++17, warn
|
||||
// about using it as an extension.
|
||||
if (!S.getLangOpts().CPlusPlus1z && A.isCXX11Attribute() &&
|
||||
if (!S.getLangOpts().CPlusPlus17 && A.isCXX11Attribute() &&
|
||||
!A.getScopeName())
|
||||
S.Diag(A.getLoc(), diag::ext_cxx17_attr) << A.getName();
|
||||
|
||||
|
|
|
@ -5923,7 +5923,7 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
|||
SourceLocation StartLoc = Arg->getLocStart();
|
||||
|
||||
// If the parameter type somehow involves auto, deduce the type now.
|
||||
if (getLangOpts().CPlusPlus1z && ParamType->isUndeducedType()) {
|
||||
if (getLangOpts().CPlusPlus17 && ParamType->isUndeducedType()) {
|
||||
// During template argument deduction, we allow 'decltype(auto)' to
|
||||
// match an arbitrary dependent argument.
|
||||
// FIXME: The language rules don't say what happens in this case.
|
||||
|
@ -6007,8 +6007,8 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
|||
EnterExpressionEvaluationContext ConstantEvaluated(
|
||||
*this, Sema::ExpressionEvaluationContext::ConstantEvaluated);
|
||||
|
||||
if (getLangOpts().CPlusPlus1z) {
|
||||
// C++1z [temp.arg.nontype]p1:
|
||||
if (getLangOpts().CPlusPlus17) {
|
||||
// C++17 [temp.arg.nontype]p1:
|
||||
// A template-argument for a non-type template parameter shall be
|
||||
// a converted constant expression of the type of the template-parameter.
|
||||
APValue Value;
|
||||
|
@ -9621,7 +9621,7 @@ Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword,
|
|||
// A type-specifier of the form
|
||||
// typename[opt] nested-name-specifier[opt] template-name
|
||||
// is a placeholder for a deduced class type [...].
|
||||
if (getLangOpts().CPlusPlus1z) {
|
||||
if (getLangOpts().CPlusPlus17) {
|
||||
if (auto *TD = getAsTypeTemplateDecl(Result.getFoundDecl())) {
|
||||
return Context.getElaboratedType(
|
||||
Keyword, QualifierLoc.getNestedNameSpecifier(),
|
||||
|
|
|
@ -344,7 +344,7 @@ static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument(
|
|||
}
|
||||
|
||||
Deduced[NTTP->getIndex()] = Result;
|
||||
if (!S.getLangOpts().CPlusPlus1z)
|
||||
if (!S.getLangOpts().CPlusPlus17)
|
||||
return Sema::TDK_Success;
|
||||
|
||||
if (NTTP->isExpandedParameterPack())
|
||||
|
@ -2934,7 +2934,7 @@ Sema::SubstituteExplicitTemplateArguments(
|
|||
// so substitution into the type must also substitute into the exception
|
||||
// specification.
|
||||
SmallVector<QualType, 4> ExceptionStorage;
|
||||
if (getLangOpts().CPlusPlus1z &&
|
||||
if (getLangOpts().CPlusPlus17 &&
|
||||
SubstExceptionSpec(
|
||||
Function->getLocation(), EPI.ExceptionSpec, ExceptionStorage,
|
||||
MultiLevelTemplateArgumentList(*ExplicitArgumentList)))
|
||||
|
@ -3908,7 +3908,7 @@ Sema::TemplateDeductionResult Sema::DeduceTemplateArguments(
|
|||
// so we can check that the exception specification matches.
|
||||
auto *SpecializationFPT =
|
||||
Specialization->getType()->castAs<FunctionProtoType>();
|
||||
if (getLangOpts().CPlusPlus1z &&
|
||||
if (getLangOpts().CPlusPlus17 &&
|
||||
isUnresolvedExceptionSpec(SpecializationFPT->getExceptionSpecType()) &&
|
||||
!ResolveExceptionSpec(Info.getLocation(), SpecializationFPT))
|
||||
return TDK_MiscellaneousDeductionFailure;
|
||||
|
@ -5152,9 +5152,9 @@ MarkUsedTemplateParameters(ASTContext &Ctx,
|
|||
if (NTTP->getDepth() == Depth)
|
||||
Used[NTTP->getIndex()] = true;
|
||||
|
||||
// In C++1z mode, additional arguments may be deduced from the type of a
|
||||
// In C++17 mode, additional arguments may be deduced from the type of a
|
||||
// non-type argument.
|
||||
if (Ctx.getLangOpts().CPlusPlus1z)
|
||||
if (Ctx.getLangOpts().CPlusPlus17)
|
||||
MarkUsedTemplateParameters(Ctx, NTTP->getType(), OnlyDeduced, Depth, Used);
|
||||
}
|
||||
|
||||
|
|
|
@ -2844,8 +2844,8 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state,
|
|||
case Declarator::TemplateParamContext:
|
||||
if (isa<DeducedTemplateSpecializationType>(Deduced))
|
||||
Error = 19; // Template parameter
|
||||
else if (!SemaRef.getLangOpts().CPlusPlus1z)
|
||||
Error = 8; // Template parameter (until C++1z)
|
||||
else if (!SemaRef.getLangOpts().CPlusPlus17)
|
||||
Error = 8; // Template parameter (until C++17)
|
||||
break;
|
||||
case Declarator::BlockLiteralContext:
|
||||
Error = 9; // Block literal
|
||||
|
@ -4463,7 +4463,7 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
|
|||
|
||||
// Exception specs are not allowed in typedefs. Complain, but add it
|
||||
// anyway.
|
||||
if (IsTypedefName && FTI.getExceptionSpecType() && !LangOpts.CPlusPlus1z)
|
||||
if (IsTypedefName && FTI.getExceptionSpecType() && !LangOpts.CPlusPlus17)
|
||||
S.Diag(FTI.getExceptionSpecLocBeg(),
|
||||
diag::err_exception_spec_in_typedef)
|
||||
<< (D.getContext() == Declarator::AliasDeclContext ||
|
||||
|
|
|
@ -2822,7 +2822,7 @@ static bool isSameEntity(NamedDecl *X, NamedDecl *Y) {
|
|||
// FIXME: Do we need to check for C++14 deduced return types here too?
|
||||
auto *XFPT = FuncX->getType()->getAs<FunctionProtoType>();
|
||||
auto *YFPT = FuncY->getType()->getAs<FunctionProtoType>();
|
||||
if (C.getLangOpts().CPlusPlus1z && XFPT && YFPT &&
|
||||
if (C.getLangOpts().CPlusPlus17 && XFPT && YFPT &&
|
||||
(isUnresolvedExceptionSpec(XFPT->getExceptionSpecType()) ||
|
||||
isUnresolvedExceptionSpec(YFPT->getExceptionSpecType())) &&
|
||||
C.hasSameFunctionTypeIgnoringExceptionSpec(FuncX->getType(),
|
||||
|
|
|
@ -138,7 +138,7 @@ int main(int argc, const char **argv) {
|
|||
// Check if NewNames is a valid identifier in C++17.
|
||||
LangOptions Options;
|
||||
Options.CPlusPlus = true;
|
||||
Options.CPlusPlus1z = true;
|
||||
Options.CPlusPlus17 = true;
|
||||
IdentifierTable Table(Options);
|
||||
for (const auto &NewName : NewNames) {
|
||||
auto NewNameTokKind = Table.get(NewName).getTokenID();
|
||||
|
|
Loading…
Reference in New Issue