head	1.1;
branch	1.1.1;
access;
symbols
	netbsd-11-0-RC7:1.1.1.1
	netbsd-11-0-RC6:1.1.1.1
	netbsd-11-0-RC5:1.1.1.1
	netbsd-11-0-RC4:1.1.1.1
	netbsd-11-0-RC3:1.1.1.1
	netbsd-11-0-RC2:1.1.1.1
	netbsd-11-0-RC1:1.1.1.1
	perseant-exfatfs-base-20250801:1.1.1.1
	netbsd-11:1.1.1.1.0.10
	netbsd-11-base:1.1.1.1
	netbsd-10-1-RELEASE:1.1.1.1
	perseant-exfatfs-base-20240630:1.1.1.1
	perseant-exfatfs:1.1.1.1.0.8
	perseant-exfatfs-base:1.1.1.1
	netbsd-10-0-RELEASE:1.1.1.1
	netbsd-10-0-RC6:1.1.1.1
	netbsd-10-0-RC5:1.1.1.1
	netbsd-10-0-RC4:1.1.1.1
	netbsd-10-0-RC3:1.1.1.1
	netbsd-10-0-RC2:1.1.1.1
	netbsd-10-0-RC1:1.1.1.1
	netbsd-10:1.1.1.1.0.6
	netbsd-10-base:1.1.1.1
	cjep_sun2x-base1:1.1.1.1
	cjep_sun2x:1.1.1.1.0.4
	cjep_sun2x-base:1.1.1.1
	cjep_staticlib_x:1.1.1.1.0.2
	cjep_staticlib_x-base1:1.1.1.1
	LLVM-249b40b558955afe5ac2b549edcf2d7f859c8cc9:1.1.1.1
	LLVM:1.1.1;
locks; strict;
comment	@// @;


1.1
date	2021.05.30.01.25.54;	author joerg;	state Exp;
branches
	1.1.1.1;
next	;
commitid	uhgdinROdC6tU6VC;

1.1.1.1
date	2021.05.30.01.25.54;	author joerg;	state Exp;
branches
	1.1.1.1.2.1;
next	;
commitid	uhgdinROdC6tU6VC;

1.1.1.1.2.1
date	2021.05.30.01.25.54;	author cjep;	state dead;
branches;
next	1.1.1.1.2.2;
commitid	eWz9SBW0XqKjJlVC;

1.1.1.1.2.2
date	2021.05.31.22.07.10;	author cjep;	state Exp;
branches;
next	;
commitid	eWz9SBW0XqKjJlVC;


desc
@@


1.1
log
@Initial revision
@
text
@//===--- ASTConcept.cpp - Concepts Related AST Data Structures --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief This file defines AST data structures related to concepts.
///
//===----------------------------------------------------------------------===//

#include "clang/AST/ASTConcept.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/TemplateBase.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
using namespace clang;

ASTConstraintSatisfaction::ASTConstraintSatisfaction(const ASTContext &C,
    const ConstraintSatisfaction &Satisfaction):
    NumRecords{Satisfaction.Details.size()},
    IsSatisfied{Satisfaction.IsSatisfied} {
  for (unsigned I = 0; I < NumRecords; ++I) {
    auto &Detail = Satisfaction.Details[I];
    if (Detail.second.is<Expr *>())
      new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I)
         UnsatisfiedConstraintRecord{Detail.first,
                                     UnsatisfiedConstraintRecord::second_type(
                                         Detail.second.get<Expr *>())};
    else {
      auto &SubstitutionDiagnostic =
          *Detail.second.get<std::pair<SourceLocation, StringRef> *>();
      unsigned MessageSize = SubstitutionDiagnostic.second.size();
      char *Mem = new (C) char[MessageSize];
      memcpy(Mem, SubstitutionDiagnostic.second.data(), MessageSize);
      auto *NewSubstDiag = new (C) std::pair<SourceLocation, StringRef>(
          SubstitutionDiagnostic.first, StringRef(Mem, MessageSize));
      new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I)
         UnsatisfiedConstraintRecord{Detail.first,
                                     UnsatisfiedConstraintRecord::second_type(
                                         NewSubstDiag)};
    }
  }
}


ASTConstraintSatisfaction *
ASTConstraintSatisfaction::Create(const ASTContext &C,
                                  const ConstraintSatisfaction &Satisfaction) {
  std::size_t size =
      totalSizeToAlloc<UnsatisfiedConstraintRecord>(
          Satisfaction.Details.size());
  void *Mem = C.Allocate(size, alignof(ASTConstraintSatisfaction));
  return new (Mem) ASTConstraintSatisfaction(C, Satisfaction);
}

void ConstraintSatisfaction::Profile(
    llvm::FoldingSetNodeID &ID, const ASTContext &C,
    const NamedDecl *ConstraintOwner, ArrayRef<TemplateArgument> TemplateArgs) {
  ID.AddPointer(ConstraintOwner);
  ID.AddInteger(TemplateArgs.size());
  for (auto &Arg : TemplateArgs)
    Arg.Profile(ID, C);
}
@


1.1.1.1
log
@Import clang 249b40b558955afe5ac2b549edcf2d7f859c8cc9.
@
text
@@


1.1.1.1.2.1
log
@file ASTConcept.cpp was added on branch cjep_staticlib_x on 2021-05-31 22:07:10 +0000
@
text
@d1 68
@


1.1.1.1.2.2
log
@sync with head
@
text
@a0 68
//===--- ASTConcept.cpp - Concepts Related AST Data Structures --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief This file defines AST data structures related to concepts.
///
//===----------------------------------------------------------------------===//

#include "clang/AST/ASTConcept.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/TemplateBase.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
using namespace clang;

ASTConstraintSatisfaction::ASTConstraintSatisfaction(const ASTContext &C,
    const ConstraintSatisfaction &Satisfaction):
    NumRecords{Satisfaction.Details.size()},
    IsSatisfied{Satisfaction.IsSatisfied} {
  for (unsigned I = 0; I < NumRecords; ++I) {
    auto &Detail = Satisfaction.Details[I];
    if (Detail.second.is<Expr *>())
      new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I)
         UnsatisfiedConstraintRecord{Detail.first,
                                     UnsatisfiedConstraintRecord::second_type(
                                         Detail.second.get<Expr *>())};
    else {
      auto &SubstitutionDiagnostic =
          *Detail.second.get<std::pair<SourceLocation, StringRef> *>();
      unsigned MessageSize = SubstitutionDiagnostic.second.size();
      char *Mem = new (C) char[MessageSize];
      memcpy(Mem, SubstitutionDiagnostic.second.data(), MessageSize);
      auto *NewSubstDiag = new (C) std::pair<SourceLocation, StringRef>(
          SubstitutionDiagnostic.first, StringRef(Mem, MessageSize));
      new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I)
         UnsatisfiedConstraintRecord{Detail.first,
                                     UnsatisfiedConstraintRecord::second_type(
                                         NewSubstDiag)};
    }
  }
}


ASTConstraintSatisfaction *
ASTConstraintSatisfaction::Create(const ASTContext &C,
                                  const ConstraintSatisfaction &Satisfaction) {
  std::size_t size =
      totalSizeToAlloc<UnsatisfiedConstraintRecord>(
          Satisfaction.Details.size());
  void *Mem = C.Allocate(size, alignof(ASTConstraintSatisfaction));
  return new (Mem) ASTConstraintSatisfaction(C, Satisfaction);
}

void ConstraintSatisfaction::Profile(
    llvm::FoldingSetNodeID &ID, const ASTContext &C,
    const NamedDecl *ConstraintOwner, ArrayRef<TemplateArgument> TemplateArgs) {
  ID.AddPointer(ConstraintOwner);
  ID.AddInteger(TemplateArgs.size());
  for (auto &Arg : TemplateArgs)
    Arg.Profile(ID, C);
}
@


