r184048 - 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.
Renato Golin
renato.golin at linaro.org
Sat Jun 15 14:20:43 PDT 2013
Hi Larisse,
Seems this commit broke lots of buildbots... ;)
cheers,
-renato
On 15 June 2013 21:17, Larisse Voufo <lvoufo at google.com> 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 at -2 {{implicit conversion from array size expression
> of type 'ConvertToInt' to integral type 'unsigned long' is incompatible
> with C++98}}
> +#else
> +// expected-warning at -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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130615/18854d8e/attachment.html>
More information about the cfe-commits
mailing list