@@ -1967,24 +1967,42 @@ class ExplicitSpecifier {
1967
1967
class CXXDeductionGuideDecl : public FunctionDecl {
1968
1968
void anchor () override ;
1969
1969
1970
+ public:
1971
+ // Represents the relationship between this deduction guide and the
1972
+ // deduction guide that it was generated from (or lack thereof).
1973
+ // See the SourceDeductionGuide member for more details.
1974
+ enum class SourceDeductionGuideKind : uint8_t {
1975
+ None,
1976
+ Alias,
1977
+ };
1978
+
1970
1979
private:
1971
1980
CXXDeductionGuideDecl (ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
1972
1981
ExplicitSpecifier ES,
1973
1982
const DeclarationNameInfo &NameInfo, QualType T,
1974
1983
TypeSourceInfo *TInfo, SourceLocation EndLocation,
1975
1984
CXXConstructorDecl *Ctor, DeductionCandidate Kind,
1976
- Expr *TrailingRequiresClause)
1985
+ Expr *TrailingRequiresClause,
1986
+ const CXXDeductionGuideDecl *GeneratedFrom,
1987
+ SourceDeductionGuideKind SourceKind)
1977
1988
: FunctionDecl(CXXDeductionGuide, C, DC, StartLoc, NameInfo, T, TInfo,
1978
1989
SC_None, false , false , ConstexprSpecKind::Unspecified,
1979
1990
TrailingRequiresClause),
1980
- Ctor (Ctor), ExplicitSpec(ES) {
1991
+ Ctor (Ctor), ExplicitSpec(ES),
1992
+ SourceDeductionGuide(GeneratedFrom, SourceKind) {
1981
1993
if (EndLocation.isValid ())
1982
1994
setRangeEnd (EndLocation);
1983
1995
setDeductionCandidateKind (Kind);
1984
1996
}
1985
1997
1986
1998
CXXConstructorDecl *Ctor;
1987
1999
ExplicitSpecifier ExplicitSpec;
2000
+ // The deduction guide, if any, that this deduction guide was generated from,
2001
+ // in the case of alias template deduction. The SourceDeductionGuideKind
2002
+ // member indicates which of these sources applies, or is None otherwise.
2003
+ llvm::PointerIntPair<const CXXDeductionGuideDecl *, 2 ,
2004
+ SourceDeductionGuideKind>
2005
+ SourceDeductionGuide;
1988
2006
void setExplicitSpecifier (ExplicitSpecifier ES) { ExplicitSpec = ES; }
1989
2007
1990
2008
public:
@@ -1997,7 +2015,9 @@ class CXXDeductionGuideDecl : public FunctionDecl {
1997
2015
TypeSourceInfo *TInfo, SourceLocation EndLocation,
1998
2016
CXXConstructorDecl *Ctor = nullptr ,
1999
2017
DeductionCandidate Kind = DeductionCandidate::Normal,
2000
- Expr *TrailingRequiresClause = nullptr );
2018
+ Expr *TrailingRequiresClause = nullptr ,
2019
+ const CXXDeductionGuideDecl *SourceDG = nullptr ,
2020
+ SourceDeductionGuideKind SK = SourceDeductionGuideKind::None);
2001
2021
2002
2022
static CXXDeductionGuideDecl *CreateDeserialized (ASTContext &C,
2003
2023
GlobalDeclID ID);
@@ -2017,6 +2037,25 @@ class CXXDeductionGuideDecl : public FunctionDecl {
2017
2037
// / this is an implicit deduction guide.
2018
2038
CXXConstructorDecl *getCorrespondingConstructor () const { return Ctor; }
2019
2039
2040
+ // / Get the deduction guide from which this deduction guide was generated,
2041
+ // / if it was generated as part of alias template deduction or from an
2042
+ // / inherited constructor.
2043
+ const CXXDeductionGuideDecl *getSourceDeductionGuide () const {
2044
+ return SourceDeductionGuide.getPointer ();
2045
+ }
2046
+
2047
+ void setSourceDeductionGuide (CXXDeductionGuideDecl *DG) {
2048
+ SourceDeductionGuide.setPointer (DG);
2049
+ }
2050
+
2051
+ SourceDeductionGuideKind getSourceDeductionGuideKind () const {
2052
+ return SourceDeductionGuide.getInt ();
2053
+ }
2054
+
2055
+ void setSourceDeductionGuideKind (SourceDeductionGuideKind SK) {
2056
+ SourceDeductionGuide.setInt (SK);
2057
+ }
2058
+
2020
2059
void setDeductionCandidateKind (DeductionCandidate K) {
2021
2060
FunctionDeclBits.DeductionCandidateKind = static_cast <unsigned char >(K);
2022
2061
}
0 commit comments