Hi Larisse, Seems this commit broke lots of buildbots... ;)
cheers, -renato On 15 June 2013 21:17, Larisse Voufo <[email protected]> wrote: > Author: lvoufo > Date: Sat Jun 15 15:17:46 2013 > New Revision: 184048 > > URL: http://llvm.org/viewvc/llvm-project?rev=184048&view=rev > Log: > Updated the support for contextual conversion tweaks (n3323) with a > previously overlooked part: implicitly converting array sizes to size_t, > rather than contextually converting them to some unique type. > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaExprCXX.cpp > cfe/trunk/test/SemaCXX/cxx98-compat-pedantic.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=184048&r1=184047&r2=184048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Jun 15 > 15:17:46 2013 > @@ -36,15 +36,15 @@ def err_typecheck_converted_constant_exp > def err_typecheck_converted_constant_expression_disallowed : Error< > "conversion from %0 to %1 is not allowed in a converted constant > expression">; > def err_expr_not_cce : Error< > - "%select{case value|enumerator value|non-type template argument}0 " > + "%select{case value|enumerator value|non-type template argument|array > size}0 " > "is not a constant expression">; > def err_cce_narrowing : ExtWarn< > - "%select{case value|enumerator value|non-type template argument}0 " > + "%select{case value|enumerator value|non-type template argument|array > size}0 " > "%select{cannot be narrowed from type %2 to %3|" > "evaluates to %2, which cannot be narrowed to type %3}1">, > InGroup<CXX11Narrowing>, DefaultError; > def err_cce_narrowing_sfinae : Error< > - "%select{case value|enumerator value|non-type template argument}0 " > + "%select{case value|enumerator value|non-type template argument|array > size}0 " > "%select{cannot be narrowed from type %2 to %3|" > "evaluates to %2, which cannot be narrowed to type %3}1">; > def err_ice_not_integral : Error< > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=184048&r1=184047&r2=184048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Sat Jun 15 15:17:46 2013 > @@ -1938,9 +1938,10 @@ public: > > /// Contexts in which a converted constant expression is required. > enum CCEKind { > - CCEK_CaseValue, ///< Expression in a case label. > - CCEK_Enumerator, ///< Enumerator value with fixed underlying type. > - CCEK_TemplateArg ///< Value of a non-type template parameter. > + CCEK_CaseValue, ///< Expression in a case label. > + CCEK_Enumerator, ///< Enumerator value with fixed underlying type. > + CCEK_TemplateArg, ///< Value of a non-type template parameter. > + CCEK_NewExpr ///< Constant expression in a noptr-new-declarator. > }; > ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, > llvm::APSInt &Value, > CCEKind CCE); > > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=184048&r1=184047&r2=184048&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sat Jun 15 15:17:46 2013 > @@ -1017,10 +1017,23 @@ Sema::ActOnCXXNew(SourceLocation StartLo > DeclaratorChunk::ArrayTypeInfo &Array = D.getTypeObject(I).Arr; > if (Expr *NumElts = (Expr *)Array.NumElts) { > if (!NumElts->isTypeDependent() && !NumElts->isValueDependent()) { > - Array.NumElts > - = VerifyIntegerConstantExpression(NumElts, 0, > - > diag::err_new_array_nonconst) > - .take(); > + if (getLangOpts().CPlusPlus1y) { > + // C++1y [expr.new]p6: Every constant-expression in a > noptr-new-declarator > + // shall be a converted constant expression (5.19) of type > std::size_t > + // and shall evaluate to a strictly positive value. > + unsigned IntWidth = Context.getTargetInfo().getIntWidth(); > + assert(IntWidth && "Builtin type of size 0?"); > + llvm::APSInt Value(IntWidth); > + Array.NumElts > + = CheckConvertedConstantExpression(NumElts, > Context.getSizeType(), Value, > + CCEK_NewExpr) > + .take(); > + } else { > + Array.NumElts > + = VerifyIntegerConstantExpression(NumElts, 0, > + > diag::err_new_array_nonconst) > + .take(); > + } > if (!Array.NumElts) > return ExprError(); > } > @@ -1183,65 +1196,81 @@ Sema::BuildCXXNew(SourceRange Range, boo > // C++1y [expr.new]p6: The expression [...] is implicitly converted to > // std::size_t. (FIXME) > if (ArraySize && !ArraySize->isTypeDependent()) { > - class SizeConvertDiagnoser : public ICEConvertDiagnoser { > - Expr *ArraySize; > - > - public: > - SizeConvertDiagnoser(Expr *ArraySize) > - : ICEConvertDiagnoser(/*AllowScopedEnumerations*/false, false, > false), > - ArraySize(ArraySize) {} > - > - virtual SemaDiagnosticBuilder diagnoseNotInt(Sema &S, > SourceLocation Loc, > - QualType T) { > - return S.Diag(Loc, diag::err_array_size_not_integral) > - << S.getLangOpts().CPlusPlus11 << T; > - } > - > - virtual SemaDiagnosticBuilder diagnoseIncomplete( > - Sema &S, SourceLocation Loc, QualType T) { > - return S.Diag(Loc, diag::err_array_size_incomplete_type) > - << T << ArraySize->getSourceRange(); > - } > - > - virtual SemaDiagnosticBuilder diagnoseExplicitConv( > - Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) { > - return S.Diag(Loc, diag::err_array_size_explicit_conversion) << T > << ConvTy; > - } > - > - virtual SemaDiagnosticBuilder noteExplicitConv( > - Sema &S, CXXConversionDecl *Conv, QualType ConvTy) { > - return S.Diag(Conv->getLocation(), > diag::note_array_size_conversion) > - << ConvTy->isEnumeralType() << ConvTy; > - } > - > - virtual SemaDiagnosticBuilder diagnoseAmbiguous( > - Sema &S, SourceLocation Loc, QualType T) { > - return S.Diag(Loc, diag::err_array_size_ambiguous_conversion) << > T; > - } > - > - virtual SemaDiagnosticBuilder noteAmbiguous( > - Sema &S, CXXConversionDecl *Conv, QualType ConvTy) { > - return S.Diag(Conv->getLocation(), > diag::note_array_size_conversion) > - << ConvTy->isEnumeralType() << ConvTy; > - } > + ExprResult ConvertedSize; > + if (getLangOpts().CPlusPlus1y) { > + unsigned IntWidth = Context.getTargetInfo().getIntWidth(); > + assert(IntWidth && "Builtin type of size 0?"); > + llvm::APSInt Value(IntWidth); > + ConvertedSize = PerformImplicitConversion(ArraySize, > Context.getSizeType(), > + AA_Converting); > + > + if (!isSFINAEContext()) > + // Diagnose the compatibility of this conversion. > + Diag(StartLoc, diag::warn_cxx98_compat_array_size_conversion) > + << ArraySize->getType() << 0 << Context.getSizeType(); > + } else { > + class SizeConvertDiagnoser : public ICEConvertDiagnoser { > + protected: > + Expr *ArraySize; > + > + public: > + SizeConvertDiagnoser(Expr *ArraySize) > + : ICEConvertDiagnoser(/*AllowScopedEnumerations*/false, > false, false), > + ArraySize(ArraySize) {} > + > + virtual SemaDiagnosticBuilder diagnoseNotInt(Sema &S, > SourceLocation Loc, > + QualType T) { > + return S.Diag(Loc, diag::err_array_size_not_integral) > + << S.getLangOpts().CPlusPlus11 << T; > + } > + > + virtual SemaDiagnosticBuilder diagnoseIncomplete( > + Sema &S, SourceLocation Loc, QualType T) { > + return S.Diag(Loc, diag::err_array_size_incomplete_type) > + << T << ArraySize->getSourceRange(); > + } > + > + virtual SemaDiagnosticBuilder diagnoseExplicitConv( > + Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) { > + return S.Diag(Loc, diag::err_array_size_explicit_conversion) << > T << ConvTy; > + } > + > + virtual SemaDiagnosticBuilder noteExplicitConv( > + Sema &S, CXXConversionDecl *Conv, QualType ConvTy) { > + return S.Diag(Conv->getLocation(), > diag::note_array_size_conversion) > + << ConvTy->isEnumeralType() << ConvTy; > + } > + > + virtual SemaDiagnosticBuilder diagnoseAmbiguous( > + Sema &S, SourceLocation Loc, QualType T) { > + return S.Diag(Loc, diag::err_array_size_ambiguous_conversion) > << T; > + } > + > + virtual SemaDiagnosticBuilder noteAmbiguous( > + Sema &S, CXXConversionDecl *Conv, QualType ConvTy) { > + return S.Diag(Conv->getLocation(), > diag::note_array_size_conversion) > + << ConvTy->isEnumeralType() << ConvTy; > + } > > - virtual SemaDiagnosticBuilder diagnoseConversion( > - Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) { > - return S.Diag(Loc, > - S.getLangOpts().CPlusPlus11 > - ? diag::warn_cxx98_compat_array_size_conversion > - : diag::ext_array_size_conversion) > - << T << ConvTy->isEnumeralType() << ConvTy; > - } > - } SizeDiagnoser(ArraySize); > + virtual SemaDiagnosticBuilder diagnoseConversion( > + Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) { > + return S.Diag(Loc, > + S.getLangOpts().CPlusPlus11 > + ? diag::warn_cxx98_compat_array_size_conversion > + : diag::ext_array_size_conversion) > + << T << ConvTy->isEnumeralType() << ConvTy; > + } > + } SizeDiagnoser(ArraySize); > > - ExprResult ConvertedSize > - = PerformContextualImplicitConversion(StartLoc, ArraySize, > SizeDiagnoser); > + ConvertedSize = PerformContextualImplicitConversion(StartLoc, > ArraySize, > + SizeDiagnoser); > + } > if (ConvertedSize.isInvalid()) > return ExprError(); > > ArraySize = ConvertedSize.take(); > QualType SizeType = ArraySize->getType(); > + > if (!SizeType->isIntegralOrUnscopedEnumerationType()) > return ExprError(); > > > Modified: cfe/trunk/test/SemaCXX/cxx98-compat-pedantic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx98-compat-pedantic.cpp?rev=184048&r1=184047&r2=184048&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/cxx98-compat-pedantic.cpp (original) > +++ cfe/trunk/test/SemaCXX/cxx98-compat-pedantic.cpp Sat Jun 15 15:17:46 > 2013 > @@ -1,10 +1,10 @@ > -// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y > -Wc++98-compat-pedantic -verify %s > -// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y -Wc++98-compat > -Werror %s > +// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y > -Wc++98-compat-pedantic -verify %s -DCXX1Y2 > +// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y -Wc++98-compat > -Werror %s -DCXX1Y2 > // RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat-pedantic > -verify %s > // RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -Werror %s > // RUN: %clang_cc1 -fsyntax-only -std=c++98 -Werror %s > > -// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++98-compat-pedantic > -verify %s -Wno-c++98-c++11-compat-pedantic > +// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++98-compat-pedantic > -verify %s -Wno-c++98-c++11-compat-pedantic -DCXX1Y2 > > // -Wc++98-compat-pedantic warns on C++11 features which we accept > without a > // warning in C++98 mode. > @@ -32,7 +32,12 @@ void *FnVoidPtr = (void*)&dlsym; // expe > struct ConvertToInt { > operator int(); > }; > -int *ArraySizeConversion = new int[ConvertToInt()]; // expected-warning > {{implicit conversion from array size expression of type 'ConvertToInt' to > integral type 'int' is incompatible with C++98}} > +int *ArraySizeConversion = new int[ConvertToInt()]; > +#ifdef CXX1Y2 > +// expected-warning@-2 {{implicit conversion from array size expression > of type 'ConvertToInt' to integral type 'unsigned long' is incompatible > with C++98}} > +#else > +// expected-warning@-4 {{implicit conversion from array size expression > of type 'ConvertToInt' to integral type 'int' is incompatible with C++98}} > +#endif > > template<typename T> class ExternTemplate {}; > extern template class ExternTemplate<int>; // expected-warning {{extern > templates are incompatible with C++98}} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
