[PATCH] D85282: [Concepts] Dump template arguments for immediately declared constraint.

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 7 01:57:42 PDT 2020


hokein added a comment.

In D85282#2198737 <https://reviews.llvm.org/D85282#2198737>, @nridge wrote:

> This patch has helped me understand the difference between the two `ConceptReference`s in the AST (the `TypeConstraint` and the `ConceptSpecializationExpr`).
>
> Given that
>
> `template <binary_concept<int> R>`
>
> is a shorthand for
>
> `template <typename R> requires binary_concept<R, int>`
>
> the `TypeConstraint` is the explicitly written `binary_concept<int>` whose `getTemplateArgsAsWritten()` has one element: `<int>`.
>
> Meanwhile the `ConceptSpecializationExpr` is the implicit `binary_concept<R, int>` whose `getTemplateArgsAsWritten()` has two elements: `<R, int>`.

Yes, true.

> Is there a reason to prefer dumping one over the other (or even both)?

This is a good question. Currently we don't dump `TypeConstrain` instead we dump the responding immediately declared constraint (which is a `ConceptSpecializationExpr`).

I think it is ok to just dump the immediately declared constraint as TypeConstrain is just a wrapper of it.

  template <binary_concept<int> R>
  
  before this patch:
  TemplateTypeParmDecl R
    |- ConceptSpecializationExpr
    `- TemplateArgument {{.*}} type 'int'
  
  after this patch:
  TemplateTypeParmDecl R
    |- ConceptSpecializationExpr
       |- TemplateArgument {{.*}} type 'R'
       `- TemplateArgument {{.*}} type 'int'
  
  maybe the following is better:
  TemplateTypeParmDecl R
    |- TypeContraint
       `- ConceptSpecializationExpr
           |- TemplateArgument {{.*}} type 'R'
           `- TemplateArgument {{.*}} type 'int'

The behavior (before this patch) is to dump the written template arguments in `TypeConstraint` as part of the `TemplateTypeParmDecl`, which doesn't seem to reasonable.
It also confuses the default template argument case.

  template<typename T = int>
  
  // is dump as 
  TemplateTypeParmDecl  T
     `-TemplateArgument type 'int'





================
Comment at: clang/test/AST/ast-dump-concepts.cpp:18
   // CHECK:      TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'binary_concept'
-  // CHECK-NEXT: |-ConceptSpecializationExpr {{.*}} <col:13, col:31> 'bool' Concept {{.*}} 'binary_concept'
-  // CHECK-NEXT: `-TemplateArgument {{.*}} type 'int'
----------------
nridge wrote:
> The ending column number here was important (it tested the fix to `ConceptSpecializationExpr::getEndLoc()` in D86413).
oh, I lost it during the rebase, added it back.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D85282/new/

https://reviews.llvm.org/D85282



More information about the cfe-commits mailing list