r284008 - Reinstate r283887 and r283882.

Manman via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 12 11:28:39 PDT 2016


Hi Vassil,

Any change between this commit and “r283887 + r283882”?
And what was the issue that caused the revert?

Thanks,
Manman

> On Oct 12, 2016, at 4:57 AM, Vassil Vassilev via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: vvassilev
> Date: Wed Oct 12 06:57:08 2016
> New Revision: 284008
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=284008&view=rev
> Log:
> Reinstate r283887 and r283882.
> 
> Original message:
> "[modules] PR28752: Do not instantiate variable declarations which are not visible.
> 
> https://reviews.llvm.org/D24508
> 
> Patch developed in collaboration with Richard Smith!"
> 
> Added:
>    cfe/trunk/test/Modules/Inputs/PR28752/
>    cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/
>    cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/b.h
>    cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/c.h
>    cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/module.modulemap
>    cfe/trunk/test/Modules/Inputs/PR28752/a.h
>    cfe/trunk/test/Modules/Inputs/PR28752/module.modulemap
>    cfe/trunk/test/Modules/Inputs/PR28752/vector
>    cfe/trunk/test/Modules/pr28752.cpp
> Modified:
>    cfe/trunk/include/clang/AST/Decl.h
>    cfe/trunk/lib/AST/Decl.cpp
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>    cfe/trunk/lib/Sema/SemaTemplate.cpp
>    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>    cfe/trunk/lib/Sema/SemaType.cpp
>    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>    cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> 
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Wed Oct 12 06:57:08 2016
> @@ -865,6 +865,11 @@ protected:
> 
>     unsigned : NumVarDeclBits;
> 
> +    // FIXME: We need something similar to CXXRecordDecl::DefinitionData.
> +    /// \brief Whether this variable is a definition which was demoted due to
> +    /// module merge.
> +    unsigned IsThisDeclarationADemotedDefinition : 1;
> +
>     /// \brief Whether this variable is the exception variable in a C++ catch
>     /// or an Objective-C @catch statement.
>     unsigned ExceptionVar : 1;
> @@ -1198,12 +1203,28 @@ public:
>   InitializationStyle getInitStyle() const {
>     return static_cast<InitializationStyle>(VarDeclBits.InitStyle);
>   }
> -
>   /// \brief Whether the initializer is a direct-initializer (list or call).
>   bool isDirectInit() const {
>     return getInitStyle() != CInit;
>   }
> 
> +  /// \brief If this definition should pretend to be a declaration.
> +  bool isThisDeclarationADemotedDefinition() const {
> +    return isa<ParmVarDecl>(this) ? false :
> +      NonParmVarDeclBits.IsThisDeclarationADemotedDefinition;
> +  }
> +
> +  /// \brief This is a definition which should be demoted to a declaration.
> +  ///
> +  /// In some cases (mostly module merging) we can end up with two visible
> +  /// definitions one of which needs to be demoted to a declaration to keep
> +  /// the AST invariants.
> +  void demoteThisDefinitionToDeclaration() {
> +    assert (isThisDeclarationADefinition() && "Not a definition!");
> +    assert (!isa<ParmVarDecl>(this) && "Cannot demote ParmVarDecls!");
> +    NonParmVarDeclBits.IsThisDeclarationADemotedDefinition = 1;
> +  }
> +
>   /// \brief Determine whether this variable is the exception variable in a
>   /// C++ catch statememt or an Objective-C \@catch statement.
>   bool isExceptionVariable() const {
> @@ -1302,6 +1323,10 @@ public:
>     NonParmVarDeclBits.PreviousDeclInSameBlockScope = Same;
>   }
> 
> +  /// \brief Retrieve the variable declaration from which this variable could
> +  /// be instantiated, if it is an instantiation (rather than a non-template).
> +  VarDecl *getTemplateInstantiationPattern() const;
> +
>   /// \brief If this variable is an instantiated static data member of a
>   /// class template specialization, returns the templated static data member
>   /// from which it was instantiated.
> 
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Wed Oct 12 06:57:08 2016
> @@ -1926,6 +1926,9 @@ VarDecl::isThisDeclarationADefinition(AS
>   //
>   // FIXME: How do you declare (but not define) a partial specialization of
>   // a static data member template outside the containing class?
> +  if (isThisDeclarationADemotedDefinition())
> +    return DeclarationOnly;
> +
>   if (isStaticDataMember()) {
>     if (isOutOfLine() &&
>         !(getCanonicalDecl()->isInline() &&
> @@ -2250,6 +2253,56 @@ bool VarDecl::checkInitIsICE() const {
>   return Eval->IsICE;
> }
> 
> +VarDecl *VarDecl::getTemplateInstantiationPattern() const {
> +  // If it's a variable template specialization, find the template or partial
> +  // specialization from which it was instantiated.
> +  if (auto *VDTemplSpec = dyn_cast<VarTemplateSpecializationDecl>(this)) {
> +    auto From = VDTemplSpec->getInstantiatedFrom();
> +    if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
> +      while (auto *NewVTD = VTD->getInstantiatedFromMemberTemplate()) {
> +        if (NewVTD->isMemberSpecialization())
> +          break;
> +        VTD = NewVTD;
> +      }
> +      return VTD->getTemplatedDecl()->getDefinition();
> +    }
> +    if (auto *VTPSD =
> +            From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
> +      while (auto *NewVTPSD = VTPSD->getInstantiatedFromMember()) {
> +        if (NewVTPSD->isMemberSpecialization())
> +          break;
> +        VTPSD = NewVTPSD;
> +      }
> +      return VTPSD->getDefinition();
> +    }
> +  }
> +
> +  if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
> +    if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
> +      VarDecl *VD = getInstantiatedFromStaticDataMember();
> +      while (auto *NewVD = VD->getInstantiatedFromStaticDataMember())
> +        VD = NewVD;
> +      return VD->getDefinition();
> +    }
> +  }
> +
> +  if (VarTemplateDecl *VarTemplate = getDescribedVarTemplate()) {
> +
> +    while (VarTemplate->getInstantiatedFromMemberTemplate()) {
> +      if (VarTemplate->isMemberSpecialization())
> +        break;
> +      VarTemplate = VarTemplate->getInstantiatedFromMemberTemplate();
> +    }
> +
> +    assert((!VarTemplate->getTemplatedDecl() ||
> +            !isTemplateInstantiation(getTemplateSpecializationKind())) &&
> +           "couldn't find pattern for variable instantiation");
> +
> +    return VarTemplate->getTemplatedDecl();
> +  }
> +  return nullptr;
> +}
> +
> VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const {
>   if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
>     return cast<VarDecl>(MSI->getInstantiatedFrom());
> 
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Oct 12 06:57:08 2016
> @@ -9708,6 +9708,22 @@ void Sema::AddInitializerToDecl(Decl *Re
>          VDecl->getDeclContext()->isDependentContext())) {
>       // The previous definition is hidden, and multiple definitions are
>       // permitted (in separate TUs). Form another definition of it.
> +      if (!isa<ParmVarDecl>(VDecl)) {
> +        // Demote the newly parsed definition to a fake declaration.
> +        if (!VDecl->isThisDeclarationADemotedDefinition())
> +          VDecl->demoteThisDefinitionToDeclaration();
> +
> +        // Make the definition visible from the point of the demotion on.
> +        assert (!Hidden || Def == Hidden &&
> +                "We were suggested another hidden definition!");
> +        makeMergedDefinitionVisible(Def, VDecl->getLocation());
> +
> +        // If this is a variable template definition, make its enclosing template
> +        // visible.
> +        if (VarDecl *VarPattern = Def->getTemplateInstantiationPattern())
> +          if (VarPattern->isThisDeclarationADefinition())
> +            makeMergedDefinitionVisible(VarPattern, VDecl->getLocation());
> +      }
>     } else {
>       Diag(VDecl->getLocation(), diag::err_redefinition)
>         << VDecl->getDeclName();
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Oct 12 06:57:08 2016
> @@ -466,10 +466,14 @@ bool Sema::DiagnoseUninstantiableTemplat
>                                           const NamedDecl *PatternDef,
>                                           TemplateSpecializationKind TSK,
>                                           bool Complain /*= true*/) {
> -  assert(isa<TagDecl>(Instantiation) || isa<FunctionDecl>(Instantiation));
> +  assert(isa<TagDecl>(Instantiation) || isa<FunctionDecl>(Instantiation) ||
> +         isa<VarDecl>(Instantiation));
> 
> -  if (PatternDef && (isa<FunctionDecl>(PatternDef)
> -                     || !cast<TagDecl>(PatternDef)->isBeingDefined())) {
> +  bool IsEntityBeingDefined = false;
> +  if (const TagDecl *TD = dyn_cast_or_null<TagDecl>(PatternDef))
> +    IsEntityBeingDefined = TD->isBeingDefined();
> +
> +  if (PatternDef && !IsEntityBeingDefined) {
>     NamedDecl *SuggestedDef = nullptr;
>     if (!hasVisibleDefinition(const_cast<NamedDecl*>(PatternDef), &SuggestedDef,
>                               /*OnlyNeedComplete*/false)) {
> @@ -486,13 +490,14 @@ bool Sema::DiagnoseUninstantiableTemplat
>   if (!Complain || (PatternDef && PatternDef->isInvalidDecl()))
>     return true;
> 
> +  llvm::Optional<unsigned> Note;
>   QualType InstantiationTy;
>   if (TagDecl *TD = dyn_cast<TagDecl>(Instantiation))
>     InstantiationTy = Context.getTypeDeclType(TD);
>   if (PatternDef) {
>     Diag(PointOfInstantiation,
>          diag::err_template_instantiate_within_definition)
> -      << (TSK != TSK_ImplicitInstantiation)
> +      << /*implicit|explicit*/(TSK != TSK_ImplicitInstantiation)
>       << InstantiationTy;
>     // Not much point in noting the template declaration here, since
>     // we're lexically inside it.
> @@ -501,28 +506,44 @@ bool Sema::DiagnoseUninstantiableTemplat
>     if (isa<FunctionDecl>(Instantiation)) {
>       Diag(PointOfInstantiation,
>            diag::err_explicit_instantiation_undefined_member)
> -        << 1 << Instantiation->getDeclName() << Instantiation->getDeclContext();
> +        << /*member function*/ 1 << Instantiation->getDeclName()
> +        << Instantiation->getDeclContext();
> +      Note = diag::note_explicit_instantiation_here;
>     } else {
> +      assert(isa<TagDecl>(Instantiation) && "Must be a TagDecl!");
>       Diag(PointOfInstantiation,
>            diag::err_implicit_instantiate_member_undefined)
>         << InstantiationTy;
> +      Note = diag::note_member_declared_at;
>     }
> -    Diag(Pattern->getLocation(), isa<FunctionDecl>(Instantiation)
> -                                     ? diag::note_explicit_instantiation_here
> -                                     : diag::note_member_declared_at);
>   } else {
> -    if (isa<FunctionDecl>(Instantiation))
> +    if (isa<FunctionDecl>(Instantiation)) {
>       Diag(PointOfInstantiation,
>            diag::err_explicit_instantiation_undefined_func_template)
>         << Pattern;
> -    else
> +      Note = diag::note_explicit_instantiation_here;
> +    } else if (isa<TagDecl>(Instantiation)) {
>       Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
>         << (TSK != TSK_ImplicitInstantiation)
>         << InstantiationTy;
> -    Diag(Pattern->getLocation(), isa<FunctionDecl>(Instantiation)
> -                                     ? diag::note_explicit_instantiation_here
> -                                     : diag::note_template_decl_here);
> +      Note = diag::note_template_decl_here;
> +    } else {
> +      assert(isa<VarDecl>(Instantiation) && "Must be a VarDecl!");
> +      if (isa<VarTemplateSpecializationDecl>(Instantiation)) {
> +        Diag(PointOfInstantiation,
> +             diag::err_explicit_instantiation_undefined_var_template)
> +          << Instantiation;
> +        Instantiation->setInvalidDecl();
> +      } else
> +        Diag(PointOfInstantiation,
> +             diag::err_explicit_instantiation_undefined_member)
> +          << /*static data member*/ 2 << Instantiation->getDeclName()
> +          << Instantiation->getDeclContext();
> +      Note = diag::note_explicit_instantiation_here;
> +    }
>   }
> +  if (Note) // Diagnostics were emitted.
> +    Diag(Pattern->getLocation(), Note.getValue());
> 
>   // In general, Instantiation isn't marked invalid to get more than one
>   // error for multiple undefined instantiations. But the code that does
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Wed Oct 12 06:57:08 2016
> @@ -4068,6 +4068,10 @@ void Sema::InstantiateVariableDefinition
>       PrettyDeclStackTraceEntry CrashInfo(*this, Var, SourceLocation(),
>                                           "instantiating variable initializer");
> 
> +      // The instantiation is visible here, even if it was first declared in an
> +      // unimported module.
> +      Var->setHidden(false);
> +
>       // If we're performing recursive template instantiation, create our own
>       // queue of pending implicit instantiations that we will instantiate
>       // later, while we're still within our own instantiation context.
> @@ -4116,33 +4120,17 @@ void Sema::InstantiateVariableDefinition
>     Def = PatternDecl->getDefinition();
>   }
> 
> -  // FIXME: Check that the definition is visible before trying to instantiate
> -  // it. This requires us to track the instantiation stack in order to know
> -  // which definitions should be visible.
> +  TemplateSpecializationKind TSK = Var->getTemplateSpecializationKind();
> 
>   // If we don't have a definition of the variable template, we won't perform
>   // any instantiation. Rather, we rely on the user to instantiate this
>   // definition (or provide a specialization for it) in another translation
>   // unit.
> -  if (!Def) {
> -    if (DefinitionRequired) {
> -      if (VarSpec) {
> -        Diag(PointOfInstantiation,
> -             diag::err_explicit_instantiation_undefined_var_template) << Var;
> -        Var->setInvalidDecl();
> -      }
> -      else
> -        Diag(PointOfInstantiation,
> -             diag::err_explicit_instantiation_undefined_member)
> -            << 2 << Var->getDeclName() << Var->getDeclContext();
> -      Diag(PatternDecl->getLocation(),
> -           diag::note_explicit_instantiation_here);
> -    } else if (Var->getTemplateSpecializationKind()
> -                 == TSK_ExplicitInstantiationDefinition) {
> +  if (!Def && !DefinitionRequired) {
> +    if (TSK == TSK_ExplicitInstantiationDefinition) {
>       PendingInstantiations.push_back(
>         std::make_pair(Var, PointOfInstantiation));
> -    } else if (Var->getTemplateSpecializationKind()
> -                 == TSK_ImplicitInstantiation) {
> +    } else if (TSK == TSK_ImplicitInstantiation) {
>       // Warn about missing definition at the end of translation unit.
>       if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
>         Diag(PointOfInstantiation, diag::warn_var_template_missing)
> @@ -4151,12 +4139,20 @@ void Sema::InstantiateVariableDefinition
>         if (getLangOpts().CPlusPlus11)
>           Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
>       }
> +      return;
>     }
> 
> -    return;
>   }
> 
> -  TemplateSpecializationKind TSK = Var->getTemplateSpecializationKind();
> +  // FIXME: We need to track the instantiation stack in order to know which
> +  // definitions should be visible within this instantiation.
> +  // FIXME: Produce diagnostics when Var->getInstantiatedFromStaticDataMember().
> +  if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Var,
> +                                     /*InstantiatedFromMember*/false,
> +                                     PatternDecl, Def, TSK,
> +                                     /*Complain*/DefinitionRequired))
> +    return;
> +
> 
>   // Never instantiate an explicit specialization.
>   if (TSK == TSK_ExplicitSpecialization)
> 
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Wed Oct 12 06:57:08 2016
> @@ -6888,6 +6888,10 @@ bool Sema::hasVisibleDefinition(NamedDec
>     if (auto *Pattern = FD->getTemplateInstantiationPattern())
>       FD = Pattern;
>     D = FD->getDefinition();
> +  } else if (auto *VD = dyn_cast<VarDecl>(D)) {
> +    if (auto *Pattern = VD->getTemplateInstantiationPattern())
> +      VD = Pattern;
> +    D = VD->getDefinition();
>   }
>   assert(D && "missing definition for pattern of instantiated definition");
> 
> 
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Oct 12 06:57:08 2016
> @@ -1216,6 +1216,7 @@ ASTDeclReader::RedeclarableResult ASTDec
>   VD->VarDeclBits.TSCSpec = Record[Idx++];
>   VD->VarDeclBits.InitStyle = Record[Idx++];
>   if (!isa<ParmVarDecl>(VD)) {
> +    VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition = Record[Idx++];
>     VD->NonParmVarDeclBits.ExceptionVar = Record[Idx++];
>     VD->NonParmVarDeclBits.NRVOVariable = Record[Idx++];
>     VD->NonParmVarDeclBits.CXXForRangeDecl = Record[Idx++];
> @@ -3069,6 +3070,29 @@ void ASTDeclReader::attachPreviousDeclIm
> namespace clang {
> template<>
> void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader,
> +                                           Redeclarable<VarDecl> *D,
> +                                           Decl *Previous, Decl *Canon) {
> +  VarDecl *VD = static_cast<VarDecl*>(D);
> +  VarDecl *PrevVD = cast<VarDecl>(Previous);
> +  D->RedeclLink.setPrevious(PrevVD);
> +  D->First = PrevVD->First;
> +
> +  // We should keep at most one definition on the chain.
> +  if (VD->isThisDeclarationADefinition()) {
> +    for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {
> +      // If we find an already demoted definition, this we already visited this
> +      // part of the chain. Reduces the loop from quadratic-time to linear-time.
> +      if (CurD->isThisDeclarationADemotedDefinition() ||
> +          CurD->isThisDeclarationADefinition()) {
> +        VD->demoteThisDefinitionToDeclaration();
> +        break;
> +      }
> +    }
> +  }
> +}
> +
> +template<>
> +void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader,
>                                            Redeclarable<FunctionDecl> *D,
>                                            Decl *Previous, Decl *Canon) {
>   FunctionDecl *FD = static_cast<FunctionDecl*>(D);
> 
> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=284008&r1=284007&r2=284008&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Wed Oct 12 06:57:08 2016
> @@ -894,6 +894,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl
>   Record.push_back(D->getTSCSpec());
>   Record.push_back(D->getInitStyle());
>   if (!isa<ParmVarDecl>(D)) {
> +    Record.push_back(D->isThisDeclarationADemotedDefinition());
>     Record.push_back(D->isExceptionVariable());
>     Record.push_back(D->isNRVOVariable());
>     Record.push_back(D->isCXXForRangeDecl());
> @@ -998,6 +999,8 @@ void ASTDeclWriter::VisitParmVarDecl(Par
>   // Check things we know are true of *every* PARM_VAR_DECL, which is more than
>   // just us assuming it.
>   assert(!D->getTSCSpec() && "PARM_VAR_DECL can't use TLS");
> +  assert(!D->isThisDeclarationADemotedDefinition()
> +         && "PARM_VAR_DECL can't be demoted definition.");
>   assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
>   assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
>   assert(D->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl");
> @@ -1957,6 +1960,7 @@ void ASTWriter::WriteDeclAbbrevs() {
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // SClass
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // TSCSpec
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // InitStyle
> +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsThisDeclarationADemotedDefinition
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable
>   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/b.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/b.h?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/b.h (added)
> +++ cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/b.h Wed Oct 12 06:57:08 2016
> @@ -0,0 +1 @@
> +#include <vector>
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/c.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/c.h?rev=284008&view=auto
> ==============================================================================
>    (empty)
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/module.modulemap
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/module.modulemap?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/module.modulemap (added)
> +++ cfe/trunk/test/Modules/Inputs/PR28752/Subdir1/module.modulemap Wed Oct 12 06:57:08 2016
> @@ -0,0 +1,5 @@
> +module b {
> +  module "b.h" { header "b.h" export * }
> +  module "c.h" { header "c.h" export * }
> +  export *
> +}
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/a.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/a.h?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/PR28752/a.h (added)
> +++ cfe/trunk/test/Modules/Inputs/PR28752/a.h Wed Oct 12 06:57:08 2016
> @@ -0,0 +1 @@
> +#include <vector>
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/module.modulemap
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/module.modulemap?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/PR28752/module.modulemap (added)
> +++ cfe/trunk/test/Modules/Inputs/PR28752/module.modulemap Wed Oct 12 06:57:08 2016
> @@ -0,0 +1 @@
> +module a { header "a.h" export * }
> 
> Added: cfe/trunk/test/Modules/Inputs/PR28752/vector
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR28752/vector?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/PR28752/vector (added)
> +++ cfe/trunk/test/Modules/Inputs/PR28752/vector Wed Oct 12 06:57:08 2016
> @@ -0,0 +1,28 @@
> +#ifndef VECTOR
> +#define VECTOR
> +template <bool, typename> struct B;
> +template <typename _Tp> struct B<true, _Tp> { typedef _Tp type; };
> +namespace std {
> +template <typename> struct D {
> +
> +  template <typename _Alloc2> struct F {
> +    static const bool value = 0;
> +  };
> +
> +  template <typename _Alloc2>
> +  typename B<F<_Alloc2>::value, _Alloc2>::type _S_select(_Alloc2);
> +  template <typename _Alloc2>
> +  static
> +  typename B<!F<_Alloc2>::value, _Alloc2>::type _S_select(_Alloc2);
> +};
> +template <typename _Alloc>
> +template <typename _Alloc2>
> +const bool D<_Alloc>::F<_Alloc2>::value;
> +
> +template <typename> class vector {
> +public:
> +  vector(int);
> +  vector(vector &) : vector(D<bool>::_S_select((bool)0)) {}
> +};
> +}
> +#endif // VECTOR
> \ No newline at end of file
> 
> Added: cfe/trunk/test/Modules/pr28752.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr28752.cpp?rev=284008&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/pr28752.cpp (added)
> +++ cfe/trunk/test/Modules/pr28752.cpp Wed Oct 12 06:57:08 2016
> @@ -0,0 +1,19 @@
> +// RUN: rm -rf %t
> +// RUN: %clang_cc1 -std=c++11 -nostdsysteminc -I%S/Inputs/PR28752 -verify %s
> +// RUN: %clang_cc1 -std=c++11 -nostdsysteminc -fmodules -fmodule-map-file=%S/Inputs/PR28752/Subdir1/module.modulemap -fmodule-map-file=%S/Inputs/PR28752/module.modulemap -fmodules-cache-path=%t -I%S/Inputs/PR28752 -I%S/Inputs/PR28752/Subdir1 -verify %s
> +
> +#include "a.h"
> +#include "Subdir1/c.h"
> +#include <vector>
> +
> +class TClingClassInfo {
> +  std::vector<int> fIterStack;
> +};
> +
> +TClingClassInfo *a;
> +class TClingBaseClassInfo {
> +  TClingBaseClassInfo() { new TClingClassInfo(*a); }
> +};
> +
> +// expected-no-diagnostics
> +
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list