* We have to avoid increasing memory consumption for regular C++ codes
  that do not use concepts lite.  This is an important criteria.  We
  have only one front-end that is invoked in C++03, C++11, C++14, and
  C++17 modes.  Almost all existing codes are C++03, C++11, and even
  C++14 only and don't use concepts lite. 

| > | Agreed. But without some source-level annotations in the tree, I don't
| > | think I can generate the diagnostics that programmer's might otherwise
| > | expect. I'd have to emit the internal representation.
| >
| > Do you have examples where we don't do or we can't do the obvious thing
| > in terms of diagnostics?
| 
| I think we'll have this problem anywhere we want to pretty-print a
| template parameter that's declared using the concept shorthand. I'll
| have a better feeling for the issue once I start working the shorthand
| in.

Maybe it will help if we have concrete situations to work from. 

| > | If those constraints are cached, I don't see any other place to put
| > | them except in the template info.
| >
| > Exactly.
| 
| Previous discussion seemed to indicate that saving constraints with
| template decls was preferable.

Yes; exactly.

| > | On the other hand, it seems like the only place we actually need to
| > | worry about is with non-template member functions.
| >
| > Member function of templates are temploids, so no worry there either.
| > (Internally, they act and are represented like templates.)
| 
| There's a difference between when those declarations are instantiated
| and when their constraints really need to be evaluated. Because
| temploids are instantiated with a class definition (prior to use), we
| (may) need to carry some information with those instances.

Yes, member *declarations* are almost always instantiated as part of the
class instantiation.

| The committed version in the branch carries those constraints in
| template_info for the temploid.

Yes; I think that is good.

| The submitted patch carries the
| instantiated constraints with the member declaration. The most recent
| version on my work computer doesn't carry any constraints with
| temploids -- it instantiates the requirements directly from the
| template/args in the declarations' template_info.
| 
| > | I think I can just grab the requirements and arguments and check them
| > | without caching them in the template_info.
| >
| > I think we need to remember them for duplicate_decls or other routines
| > that either check or use ODR-derived properties.
| 
| This doesn't seem to be a problem. IIRC, the instantiated declarations
| are differentiated by their template constraints, not their
| instantiated constraints.
| 
| Differentiating by instantiated constraints may not be viable,
| anyways. Especially, if the instantiation folds them to only "true" or
| "false".

Hmm, I am lost here.  Could you clarify with examples?

| > | We still don't have nodes specific to TEMPLTAE_DECL or
| > | TEMPLATE_PARM_DECL though.
| >
| > A tree with TREE_CODE equal to TEMPLATE_DECL or TEMPLATE_PARM_DECL is
| > just that.  What we do is to use all unused- tree slots.  Or are you
| > suggesting we have exhausted all available pre-defined slots on such nodes?
| 
| Unknown. I'll have to look.
| 
| But, I don't think we have a single TEMPLATE_PARM_DECL node. 
| Template parameters are either TYPE_DECLs or PARM_DECLs. I think auto
| declarations, get VAR_DECLs, but I haven't looked closely at that
| design. I'd have to look to see if there are any free tree slots all
| of those decl nodes to minimize.

the type specifier 'auto' is represented by a fresh TEMPLATE_TYPE_PARM,
therefore has a TEMPLATE_TYPE_DECL.

-- Gaby

Reply via email to