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.

Larisse Voufo lvoufo at google.com
Sat Jun 15 21:47:37 PDT 2013


On Sat, Jun 15, 2013 at 2:20 PM, Renato Golin <renato.golin at linaro.org>wrote:

> Hi Larisse,
>
> Seems this commit broke lots of buildbots... ;)
>

Yeah. That's weird. I am not exactly sure how the specific changes I made
could cause that kind of damage, especially when I successfully ran all the
regression tests before commiting...
I was informed that buildbots haven't been the most reliable lately(?)
However, I'm still not quite sure how to tell "flakes" from non-"flakes".
Any idea?
I just noticed that a couple of the failures have to do with a test case's
expected warning message not matching some architecture-specific data. I
have fixed the test case in question, and did some code-base resetting
(directly mirroring the repository) over here. Hopefully that will fix at
least a few of these...

Thanks,
-- Larisse.


> 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/8e79e34b/attachment.html>


More information about the cfe-commits mailing list