[cfe-commits] r150688 - in /cfe/trunk: lib/Sema/SemaExprCXX.cpp test/SemaCXX/new-delete-cxx0x.cpp

Matthieu Monrocq matthieu.monrocq at gmail.com
Thu Feb 16 11:40:49 PST 2012


Le 16 février 2012 13:59, Sebastian Redl <sebastian.redl at getdesigned.at> a
écrit :

> Author: cornedbee
> Date: Thu Feb 16 06:59:47 2012
> New Revision: 150688
>
> URL: http://llvm.org/viewvc/llvm-project?rev=150688&view=rev
> Log:
> Proper checking of list-initializers for array new expressions.
>
> This finishes generalized initializer support in Sema.
>
>
Just to point that Richard just started the budgeoning Release notes for
3.1, it may be worth mentioning this support there ?

-- Matthieu


> Modified:
>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>    cfe/trunk/test/SemaCXX/new-delete-cxx0x.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=150688&r1=150687&r2=150688&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Feb 16 06:59:47 2012
> @@ -30,6 +30,7 @@
>  #include "clang/Basic/TargetInfo.h"
>  #include "clang/Lex/Preprocessor.h"
>  #include "TypeLocBuilder.h"
> +#include "llvm/ADT/APInt.h"
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/Support/ErrorHandling.h"
>  using namespace clang;
> @@ -976,7 +977,8 @@
>                      TypeContainsAuto);
>  }
>
> -static bool isLegalArrayNewInitializer(Expr *Init) {
> +static bool isLegalArrayNewInitializer(CXXNewExpr::InitializationStyle
> Style,
> +                                       Expr *Init) {
>   if (!Init)
>     return true;
>   if (ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) {
> @@ -989,6 +991,11 @@
>   else if (CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init))
>     return !CCE->isListInitialization() &&
>            CCE->getConstructor()->isDefaultConstructor();
> +  else if (Style == CXXNewExpr::ListInit) {
> +    assert(isa<InitListExpr>(Init) &&
> +           "Shouldn't create list CXXConstructExprs for arrays.");
> +    return true;
> +  }
>   return false;
>  }
>
> @@ -1240,14 +1247,26 @@
>     }
>   }
>
> +  QualType InitType = AllocType;
>   // Array 'new' can't have any initializers except empty parentheses.
> -  if (!isLegalArrayNewInitializer(Initializer) &&
> -      (ResultType->isArrayType() || ArraySize)) {
> -    SourceRange InitRange(Inits[0]->getLocStart(),
> -                          Inits[NumInits - 1]->getLocEnd());
> -
> -    Diag(StartLoc, diag::err_new_array_init_args) << InitRange;
> -    return ExprError();
> +  // Initializer lists are also allowed, in C++11. Rely on the parser for
> the
> +  // dialect distinction.
> +  if (ResultType->isArrayType() || ArraySize) {
> +    if (!isLegalArrayNewInitializer(initStyle, Initializer)) {
> +      SourceRange InitRange(Inits[0]->getLocStart(),
> +                            Inits[NumInits - 1]->getLocEnd());
> +      Diag(StartLoc, diag::err_new_array_init_args) << InitRange;
> +      return ExprError();
> +    }
> +    if (InitListExpr *ILE = dyn_cast_or_null<InitListExpr>(Initializer)) {
> +      // We do the initialization typechecking against the array type
> +      // corresponding to the number of initializers + 1 (to also check
> +      // default-initialization).
> +      unsigned NumElements = ILE->getNumInits() + 1;
> +      InitType = Context.getConstantArrayType(AllocType,
> +          llvm::APInt(Context.getTypeSize(Context.getSizeType()),
> NumElements),
> +                                              ArrayType::Normal, 0);
> +    }
>   }
>
>   if (!AllocType->isDependentType() &&
> @@ -1270,7 +1289,7 @@
>                                                  DirectInitRange.getEnd());
>
>     InitializedEntity Entity
> -      = InitializedEntity::InitializeNew(StartLoc, AllocType);
> +      = InitializedEntity::InitializeNew(StartLoc, InitType);
>     InitializationSequence InitSeq(*this, Entity, Kind, Inits, NumInits);
>     ExprResult FullInit = InitSeq.Perform(*this, Entity, Kind,
>                                           MultiExprArg(Inits, NumInits));
>
> Modified: cfe/trunk/test/SemaCXX/new-delete-cxx0x.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/new-delete-cxx0x.cpp?rev=150688&r1=150687&r2=150688&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/new-delete-cxx0x.cpp (original)
> +++ cfe/trunk/test/SemaCXX/new-delete-cxx0x.cpp Thu Feb 16 06:59:47 2012
> @@ -7,3 +7,20 @@
>   (void)new int[-1]; // expected-warning {{array size is negative}}
>   (void)new int[2000000000]; // expected-warning {{array is too large}}
>  }
> +
> +
> +struct S {
> +  S(int);
> +  S();
> +  ~S();
> +};
> +
> +struct T { // expected-note 2 {{not viable}}
> +  T(int); // expected-note {{not viable}}
> +};
> +
> +void fn() {
> +  (void) new int[2] {1, 2};
> +  (void) new S[2] {1, 2};
> +  (void) new T[2] {1, 2}; // expected-error {{no matching constructor}}
> +}
>
>
> _______________________________________________
> 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/20120216/6d5de27d/attachment.html>


More information about the cfe-commits mailing list