r235166 - Move fixit for const init from note to diag, weaken to warning in MS mode.

David Blaikie dblaikie at gmail.com
Fri Apr 17 08:56:40 PDT 2015


On Fri, Apr 17, 2015 at 1:32 AM, Nico Weber <nicolasweber at gmx.de> wrote:
> Author: nico
> Date: Fri Apr 17 03:32:38 2015
> New Revision: 235166
>
> URL: http://llvm.org/viewvc/llvm-project?rev=235166&view=rev
> Log:
> Move fixit for const init from note to diag, weaken to warning in MS mode.

There's a general rule that we don't put fixits on warnings because in
-fix-it mode we need to recover exactly as if the fixit were applied
(& since it's only a warning we can't change the recovery path to do
something different based on the fact that the warning occurred). I'm
not sure if there are exceptions to this rule.

 - David

>
> r235046 turned "extern __declspec(selectany) int a;" from a declaration into
> a definition to fix PR23242 (required for compatibility with mc.exe output).
> However, this broke parsing Windows headers: A  d3d11 headers contain something
> like
>
>   struct SomeStruct {};
>   extern const __declspec(selectany) SomeStruct some_struct;
>
> This is now a definition, and const objects either need an explicit default
> ctor or an initializer so this errors out with
>
>   d3d11.h(1065,48) :
>     error: default initialization of an object of const type
>            'const CD3D11_DEFAULT' without a user-provided default constructor
>
> (cl.exe just doesn't implement this rule, independent of selectany.)
>
> To work around this, weaken this error into a warning for selectany decls
> in microsoft mode, and recover with zero-initialization.
>
> Doing this is a bit hairy since it adds a fixit on an error emitted
> by InitializationSequence – this means it needs to build a correct AST, which
> in turn means InitializationSequence::Failed() cannot return true when this
> fixit is applied. As a workaround, the patch adds a fixit member to
> InitializationSequence, and InitializationSequence::Perform() prints the
> diagnostic if the fixit member is set right after its call to Diagnose.
> That function is usually called when InitializationSequences are used –
> InitListChecker::PerformEmptyInit() doesn't call it, but the InitListChecker
> case never performs default-initialization, so this is technically OK.
>
> This is the alternative, original fix for PR20208 that got reviewed in the
> thread "[patch] Improve diagnostic on default-initializing const variables
> (PR20208)".  This change basically reverts r213725, adds the original fix for
> PR20208, and makes the error a warning in Microsoft mode.
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Sema/Initialization.h
>     cfe/trunk/lib/Sema/SemaInit.cpp
>     cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
>     cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp
>     cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp
>     cfe/trunk/test/CXX/drs/dr0xx.cpp
>     cfe/trunk/test/CXX/drs/dr4xx.cpp
>     cfe/trunk/test/FixIt/fixit.cpp
>     cfe/trunk/test/SemaCXX/attr-selectany.cpp
>     cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
>     cfe/trunk/test/SemaCXX/constexpr-value-init.cpp
>     cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp
>     cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Apr 17 03:32:38 2015
> @@ -5470,8 +5470,11 @@ def err_address_space_qualified_delete :
>  def err_default_init_const : Error<
>    "default initialization of an object of const type %0"
>    "%select{| without a user-provided default constructor}1">;
> -def note_add_initializer : Note<
> -  "add an explicit initializer to initialize %0">;
> +def ext_default_init_const : ExtWarn<
> +  "default initialization of an object of const type %0"
> +  "%select{| without a user-provided default constructor}1 "
> +  "is a Microsoft extension">,
> +  InGroup<Microsoft>;
>  def err_delete_operand : Error<"cannot delete expression of type %0">;
>  def ext_delete_void_ptr_operand : ExtWarn<
>    "cannot delete expression with pointer-to-'void' type %0">,
>
> Modified: cfe/trunk/include/clang/Sema/Initialization.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Initialization.h?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Initialization.h (original)
> +++ cfe/trunk/include/clang/Sema/Initialization.h Fri Apr 17 03:32:38 2015
> @@ -844,6 +844,21 @@ private:
>
>    /// \brief The incomplete type that caused a failure.
>    QualType FailedIncompleteType;
> +
> +  /// \brief The fixit that needs to be applied to make this initialization
> +  /// succeed.
> +  std::string ZeroInitializationFixit;
> +  SourceLocation ZeroInitializationFixitLoc;
> +
> +public:
> +  /// \brief Call for initializations are invalid but that would be valid
> +  /// zero initialzations if Fixit was applied.
> +  void SetZeroInitializationFixit(const std::string& Fixit, SourceLocation L) {
> +    ZeroInitializationFixit = Fixit;
> +    ZeroInitializationFixitLoc = L;
> +  }
> +
> +private:
>
>    /// \brief Prints a follow-up note that highlights the location of
>    /// the initialized entity, if it's remote.
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Apr 17 03:32:38 2015
> @@ -3101,6 +3101,28 @@ void InitializationSequence::SetOverload
>  // Attempt initialization
>  //===----------------------------------------------------------------------===//
>
> +/// Tries to add a zero initializer. Returns true if that worked.
> +static bool
> +maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence,
> +                                   const InitializedEntity &Entity) {
> +  if (Entity.getKind() != InitializedEntity::EK_Variable)
> +    return false;
> +
> +  VarDecl *VD = cast<VarDecl>(Entity.getDecl());
> +  if (VD->getInit() || VD->getLocEnd().isMacroID())
> +    return false;
> +
> +  QualType VariableTy = VD->getType().getCanonicalType();
> +  SourceLocation Loc = S.getLocForEndOfToken(VD->getLocEnd());
> +  std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
> +  if (!Init.empty()) {
> +    Sequence.AddZeroInitializationStep(Entity.getType());
> +    Sequence.SetZeroInitializationFixit(Init, Loc);
> +    return true;
> +  }
> +  return false;
> +}
> +
>  static void MaybeProduceObjCObject(Sema &S,
>                                     InitializationSequence &Sequence,
>                                     const InitializedEntity &Entity) {
> @@ -3339,7 +3361,8 @@ static void TryConstructorInitialization
>    if (Kind.getKind() == InitializationKind::IK_Default &&
>        Entity.getType().isConstQualified() &&
>        !cast<CXXConstructorDecl>(Best->Function)->isUserProvided()) {
> -    Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
> +    if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
> +      Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
>      return;
>    }
>
> @@ -4231,7 +4254,8 @@ static void TryDefaultInitialization(Sem
>    //   a const-qualified type T, T shall be a class type with a user-provided
>    //   default constructor.
>    if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
> -    Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
> +    if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
> +      Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
>      return;
>    }
>
> @@ -5749,6 +5773,21 @@ InitializationSequence::Perform(Sema &S,
>      Diagnose(S, Entity, Kind, Args);
>      return ExprError();
>    }
> +  if (!ZeroInitializationFixit.empty()) {
> +    unsigned DiagID = diag::err_default_init_const;
> +    if (Decl *D = Entity.getDecl())
> +      if (S.getLangOpts().MSVCCompat && D->hasAttr<SelectAnyAttr>())
> +        DiagID = diag::ext_default_init_const;
> +
> +    // The initialization would have succeeded with this fixit. Since the fixit
> +    // is on the error, we need to build a valid AST in this case, so this isn't
> +    // handled in the Failed() branch above.
> +    QualType DestType = Entity.getType();
> +    S.Diag(Kind.getLocation(), DiagID)
> +        << DestType << (bool)DestType->getAs<RecordType>()
> +        << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
> +                                      ZeroInitializationFixit);
> +  }
>
>    if (getKind() == DependentSequence) {
>      // If the declaration is a non-dependent, incomplete array type
> @@ -6549,26 +6588,6 @@ static void diagnoseListInit(Sema &S, co
>           "Inconsistent init list check result.");
>  }
>
> -/// Prints a fixit for adding a null initializer for |Entity|. Call this only
> -/// right after emitting a diagnostic.
> -static void maybeEmitZeroInitializationFixit(Sema &S,
> -                                             InitializationSequence &Sequence,
> -                                             const InitializedEntity &Entity) {
> -  if (Entity.getKind() != InitializedEntity::EK_Variable)
> -    return;
> -
> -  VarDecl *VD = cast<VarDecl>(Entity.getDecl());
> -  if (VD->getInit() || VD->getLocEnd().isMacroID())
> -    return;
> -
> -  QualType VariableTy = VD->getType().getCanonicalType();
> -  SourceLocation Loc = S.getLocForEndOfToken(VD->getLocEnd());
> -  std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
> -
> -  S.Diag(Loc, diag::note_add_initializer)
> -      << VD << FixItHint::CreateInsertion(Loc, Init);
> -}
> -
>  bool InitializationSequence::Diagnose(Sema &S,
>                                        const InitializedEntity &Entity,
>                                        const InitializationKind &Kind,
> @@ -6900,7 +6919,6 @@ bool InitializationSequence::Diagnose(Se
>      } else {
>        S.Diag(Kind.getLocation(), diag::err_default_init_const)
>            << DestType << (bool)DestType->getAs<RecordType>();
> -      maybeEmitZeroInitializationFixit(S, *this, Entity);
>      }
>      break;
>
>
> Modified: cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp Fri Apr 17 03:32:38 2015
> @@ -17,7 +17,7 @@ extern int (*const d)(int);
>
>  // A variable declaration which uses the constexpr specifier shall have an
>  // initializer and shall be initialized by a constant expression.
> -constexpr int ni1; // expected-error {{default initialization of an object of const type 'const int'}} expected-note {{add an explicit initializer to initialize 'ni1'}}
> +constexpr int ni1; // expected-error {{default initialization of an object of const type 'const int'}}
>  constexpr struct C { C(); } ni2; // expected-error {{cannot have non-literal type 'const struct C'}} expected-note 3{{has no constexpr constructors}}
>  constexpr double &ni3; // expected-error {{declaration of reference variable 'ni3' requires an initializer}}
>
> @@ -34,4 +34,4 @@ struct pixel {
>    int x, y;
>  };
>  constexpr pixel ur = { 1294, 1024 }; // ok
> -constexpr pixel origin;              // expected-error {{default initialization of an object of const type 'const pixel' without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'origin'}}
> +constexpr pixel origin;              // expected-error {{default initialization of an object of const type 'const pixel' without a user-provided default constructor}}
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp Fri Apr 17 03:32:38 2015
> @@ -36,7 +36,7 @@ struct S3 {
>  constexpr S3 s3a = S3(0);
>  constexpr S3 s3b = s3a;
>  constexpr S3 s3c = S3();
> -constexpr S3 s3d; // expected-error {{default initialization of an object of const type 'const S3' without a user-provided default constructor}} expected-note{{add an explicit initializer to initialize 's3d'}}
> +constexpr S3 s3d; // expected-error {{default initialization of an object of const type 'const S3' without a user-provided default constructor}}
>
>  struct S4 {
>    S4() = default;
> @@ -119,6 +119,6 @@ namespace PR13492 {
>    };
>
>    void f() {
> -    const B b; // expected-error {{default initialization of an object of const type 'const PR13492::B' without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'b'}}
> +    const B b; // expected-error {{default initialization of an object of const type 'const PR13492::B' without a user-provided default constructor}}
>    }
>  }
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp Fri Apr 17 03:32:38 2015
> @@ -10,15 +10,15 @@ struct NoUserDefault : public MakeNonPOD
>  struct HasUserDefault { HasUserDefault(); };
>
>  void test_const_default_init() {
> -  const NoUserDefault x1; // expected-error{{default initialization of an object of const type 'const NoUserDefault' without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'x1'}}
> +  const NoUserDefault x1; // expected-error{{default initialization of an object of const type 'const NoUserDefault' without a user-provided default constructor}}
>    const HasUserDefault x2;
> -  const int x3; // expected-error{{default initialization of an object of const type 'const int'}} expected-note{{add an explicit initializer to initialize 'x3'}}
> +  const int x3; // expected-error{{default initialization of an object of const type 'const int'}}
>  }
>
>  // rdar://8501008
>  struct s0 {};
>  struct s1 { static const s0 foo; };
> -const struct s0 s1::foo; // expected-error{{default initialization of an object of const type 'const struct s0' without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'foo'}}
> +const struct s0 s1::foo; // expected-error{{default initialization of an object of const type 'const struct s0' without a user-provided default constructor}}
>
>  template<typename T>
>  struct s2 {
>
> Modified: cfe/trunk/test/CXX/drs/dr0xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr0xx.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/drs/dr0xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr0xx.cpp Fri Apr 17 03:32:38 2015
> @@ -864,7 +864,7 @@ namespace dr77 { // dr77: yes
>  namespace dr78 { // dr78: sup ????
>    // Under DR78, this is valid, because 'k' has static storage duration, so is
>    // zero-initialized.
> -  const int k; // expected-error {{default initialization of an object of const}} expected-note{{add an explicit initializer to initialize 'k'}}
> +  const int k; // expected-error {{default initialization of an object of const}}
>  }
>
>  // dr79: na
>
> Modified: cfe/trunk/test/CXX/drs/dr4xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr4xx.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/drs/dr4xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr4xx.cpp Fri Apr 17 03:32:38 2015
> @@ -1202,9 +1202,9 @@ namespace dr497 { // dr497: yes
>      struct S {
>        mutable int i;
>      };
> -    const S cs; // expected-error {{default initialization}} expected-note {{add an explicit initializer}}
> +    const S cs; // expected-error {{default initialization}}
>      int S::*pm = &S::i;
> -    cs.*pm = 88;
> +    cs.*pm = 88; // expected-error {{not assignable}}
>    }
>
>    void after() {
>
> Modified: cfe/trunk/test/FixIt/fixit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/FixIt/fixit.cpp (original)
> +++ cfe/trunk/test/FixIt/fixit.cpp Fri Apr 17 03:32:38 2015
> @@ -387,3 +387,11 @@ struct conversion_operator {
>    // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:32}:""
>    // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:44-[[@LINE-2]]:44}:" conversion_operator::* const"
>  };
> +
> +struct const_zero_init {
> +  int a;
> +};
> +const const_zero_init czi; // expected-error {{default initialization of an object of const type 'const const_zero_init'}}
> +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:26-[[@LINE-1]]:26}:"{}"
> +int use_czi = czi.a;
> +
>
> Modified: cfe/trunk/test/SemaCXX/attr-selectany.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-selectany.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/attr-selectany.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-selectany.cpp Fri Apr 17 03:32:38 2015
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify -std=c++11 %s
> +// RUN: %clang_cc1 -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s
>  // MSVC produces similar diagnostics.
>
>  __declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}}
> @@ -34,3 +34,13 @@ __declspec(selectany) X x(1);
>
>  namespace { class Internal {}; }
>  __declspec(selectany) auto x8 = Internal(); // expected-error {{'selectany' can only be applied to data items with external linkage}}
> +
> +
> +// The D3D11 headers do something like this.  MSVC doesn't error on this at
> +// all, even without the __declspec(selectany), in violation of the standard.
> +// We fall back to a warning for selectany to accept headers.
> +struct SomeStruct {};
> +extern const __declspec(selectany) SomeStruct some_struct; // expected-warning {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor is a Microsoft extension}}
> +
> +// Without selectany, this should stay an error.
> +const SomeStruct some_struct2; // expected-error {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor}}
>
> Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
> +++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Fri Apr 17 03:32:38 2015
> @@ -1179,7 +1179,7 @@ namespace ExternConstexpr {
>    void f() {
>      extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}}
>      constexpr int j = 0;
> -    constexpr int k; // expected-error {{default initialization of an object of const type}} expected-note{{add an explicit initializer to initialize 'k'}}
> +    constexpr int k; // expected-error {{default initialization of an object of const type}}
>    }
>  }
>
>
> Modified: cfe/trunk/test/SemaCXX/constexpr-value-init.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constexpr-value-init.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/constexpr-value-init.cpp (original)
> +++ cfe/trunk/test/SemaCXX/constexpr-value-init.cpp Fri Apr 17 03:32:38 2015
> @@ -14,7 +14,7 @@ void f() {
>    constexpr A a; // expected-error {{constant expression}} expected-note {{in call to 'A()'}}
>  }
>
> -constexpr B b1; // expected-error {{without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'b1'}}
> +constexpr B b1; // expected-error {{without a user-provided default constructor}}
>  constexpr B b2 = B(); // ok
>  static_assert(b2.a.a == 1, "");
>  static_assert(b2.a.b == 2, "");
> @@ -23,9 +23,9 @@ struct C {
>    int c;
>  };
>  struct D : C { int d; };
> -constexpr C c1; // expected-error {{without a user-provided default constructor}} expected-note{{add an explicit initializer to initialize 'c1'}}
> +constexpr C c1; // expected-error {{without a user-provided default constructor}}
>  constexpr C c2 = C(); // ok
> -constexpr D d1; // expected-error {{without a user-provided default constructor}} expected-note{{add an explicit initializer to initialize 'd1'}}
> +constexpr D d1; // expected-error {{without a user-provided default constructor}}
>  constexpr D d2 = D(); // ok with DR1452
>  static_assert(D().c == 0, "");
>  static_assert(D().d == 0, "");
>
> Modified: cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp Fri Apr 17 03:32:38 2015
> @@ -25,7 +25,7 @@ void fn1 () {
>    non_const_copy ncc2 = ncc;
>    ncc = ncc2;
>    const non_const_copy cncc{};
> -  const non_const_copy cncc1; // expected-error {{default initialization of an object of const type 'const non_const_copy' without a user-provided default constructor}} expected-note {{add an explicit initializer to initialize 'cncc1'}}
> +  const non_const_copy cncc1; // expected-error {{default initialization of an object of const type 'const non_const_copy' without a user-provided default constructor}}
>    non_const_copy ncc3 = cncc; // expected-error {{no matching}}
>    ncc = cncc; // expected-error {{no viable overloaded}}
>  };
>
> Modified: cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp?rev=235166&r1=235165&r2=235166&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp Fri Apr 17 03:32:38 2015
> @@ -58,13 +58,13 @@ namespace out_of_line {
>      template<typename T, typename T0> static CONST T b = T(100);
>      template<typename T> static CONST T b<T,int>;
>    };
> -  template<typename T, typename T0> CONST T B4::a; // expected-error {{default initialization of an object of const type 'const int'}} expected-note {{add an explicit initializer to initialize 'a<int, char>'}}
> +  template<typename T, typename T0> CONST T B4::a; // expected-error {{default initialization of an object of const type 'const int'}}
>    template<typename T> CONST T B4::a<T,int>;
>    template CONST int B4::a<int,char>; // expected-note {{in instantiation of}}
>    template CONST int B4::a<int,int>;
>
>    template<typename T, typename T0> CONST T B4::b;
> -  template<typename T> CONST T B4::b<T,int>; // expected-error {{default initialization of an object of const type 'const int'}} expected-note {{add an explicit initializer to initialize 'b<int, int>'}}
> +  template<typename T> CONST T B4::b<T,int>; // expected-error {{default initialization of an object of const type 'const int'}}
>    template CONST int B4::b<int,char>;
>    template CONST int B4::b<int,int>; // expected-note {{in instantiation of}}
>  }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list