<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
<title>P0332r1 : Relaxed Incomplete Multidimensional Array Type Declaration</title>
<meta name="date" content="2017-10-11" />
<meta name="author" content="H. Carter Edwards" />
<meta name="author" content="Bryce Lelbach" />
<meta name="author" content="Christian Trott" />
<meta name="author" content="Mauro Bianco" />
<meta name="author" content="Athanasios Iliopoulos" />
<meta name="author" content="John Michopoulos" />
<style type="text/css">

/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7614 2013-02-21 15:55:51Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
  overflow: hidden;
}

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin: 0 0 0.5em 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left, .figure.align-left, object.align-left {
  clear: left ;
  float: left ;
  margin-right: 1em }

img.align-right, .figure.align-right, object.align-right {
  clear: right ;
  float: right ;
  margin-left: 1em }

img.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.align-left {
  text-align: left }

.align-center {
  clear: both ;
  text-align: center }

.align-right {
  text-align: right }

/* reset inner alignment in figures */
div.align-right {
  text-align: inherit }

/* div.align-center * { */
/*   text-align: left } */

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font: inherit }

pre.literal-block, pre.doctest-block, pre.math, pre.code {
  margin-left: 2em ;
  margin-right: 2em }

pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
  border: 0px;
  border-top: 2px solid;
  border-bottom: 2px solid;
  border-collapse: collapse;
}
table.docutils.booktabs * {
  border: 0px;
}
table.docutils.booktabs th {
  border-bottom: thin solid;
  text-align: left;
}

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document" id="p0332r1-relaxed-incomplete-multidimensional-array-type-declaration">
<h1 class="title">P0332r1 : Relaxed Incomplete Multidimensional Array Type Declaration</h1>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
<tbody valign="top">
<tr class="field"><th class="docinfo-name">Project:</th><td class="field-body">ISO JTC1/SC22/WG21: Programming Language C++</td>
</tr>
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">P0332r1</td>
</tr>
<tr><th class="docinfo-name">Date:</th>
<td>2017-10-11</td></tr>
<tr class="field"><th class="docinfo-name">Reply-to:</th><td class="field-body"><a class="reference external" href="mailto:hcedwar&#64;sandia.gov">hcedwar&#64;sandia.gov</a>, <a class="reference external" href="mailto:balelbach&#64;lbl.gov">balelbach&#64;lbl.gov</a></td>
</tr>
<tr><th class="docinfo-name">Author:</th>
<td>H. Carter Edwards</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:hcedwar&#64;sandia.gov">hcedwar&#64;sandia.gov</a></td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>Bryce Lelbach</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:balelbach&#64;lbl.gov">balelbach&#64;lbl.gov</a></td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>Christian Trott</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:crtrott&#64;sandia.gov">crtrott&#64;sandia.gov</a></td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>Mauro Bianco</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:mbianco&#64;cscs.ch">mbianco&#64;cscs.ch</a></td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>Athanasios Iliopoulos</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:athanasios.iliopoulos&#64;nrl.navy.mil">athanasios.iliopoulos&#64;nrl.navy.mil</a></td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>John Michopoulos</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:john.michopoulos&#64;nrl.navy.mil">john.michopoulos&#64;nrl.navy.mil</a></td></tr>
<tr class="field"><th class="docinfo-name">Audience:</th><td class="field-body">Library Evolution Working Group (LEWG)</td>
</tr>
<tr class="field"><th class="docinfo-name">Audience:</th><td class="field-body">Evolution Working Group (LEWG)</td>
</tr>
<tr class="field"><th class="docinfo-name">URL:</th><td class="field-body"><a class="reference external" href="https://github.com/kokkos/array_ref/blob/master/proposals/P0332.rst">https://github.com/kokkos/array_ref/blob/master/proposals/P0332.rst</a></td>
</tr>
</tbody>
</table>
<table border="1" class="docutils">
<colgroup>
<col width="16%" />
<col width="84%" />
</colgroup>
<tbody valign="top">
<tr><td colspan="2"><strong>Revision History</strong></td>
</tr>
<tr><td>P0009r0</td>
<td>Original multidimensional array reference paper with
motivation, specification, and examples.</td>
</tr>
<tr><td>P0009r1</td>
<td>Revised with renaming from <tt class="docutils literal">view</tt> to <tt class="docutils literal">array_ref</tt>
and allow unbounded rank through variadic arguments.</td>
</tr>
<tr><td>P0332r0</td>
<td>Relaxed array declaration moved from P0009.</td>
</tr>
<tr><td>P0332r1
<em>(current</em>)</td>
<td>Align with updates to P0009.
Add examples of precedents.</td>
</tr>
<tr><td colspan="2"><strong>References</strong></td>
</tr>
<tr><td>P0454r0</td>
<td>Wording for a Minimal <tt class="docutils literal">mdspan</tt></td>
</tr>
<tr><td>P0009r2</td>
<td>Multidimensional array reference specification</td>
</tr>
<tr><td>P0331</td>
<td>Multidimensional array reference motivation and examples</td>
</tr>
</tbody>
</table>
<div class="section" id="motivation">
<h1>Motivation</h1>
<p>The dimensions of multidimensional array reference <tt class="docutils literal">mdspan</tt>
(P0009) are declared a syntactically verbose property argument.
We propose a trivial, non-breaking relaxation of the
array type declaration in <strong>11.3.4p3</strong> to allow a concise
and intuitive syntax for multidimensional declarations.</p>
<pre class="code c++ literal-block">
<span class="keyword">template</span><span class="operator">&lt;</span> <span class="keyword">typename</span> <span class="name">DataType</span> <span class="punctuation">,</span> <span class="keyword">typename</span> <span class="name">Properties</span><span class="punctuation">...</span> <span class="operator">&gt;</span>
<span class="keyword">struct</span> <span class="name">mdspan</span> <span class="punctuation">;</span>

<span class="comment single">// Three dimensional tensor type declaration with verbose syntax
</span>
<span class="keyword">using</span> <span class="name">tensor</span> <span class="operator">=</span> <span class="name">std</span><span class="operator">::</span><span class="name">mdspan</span><span class="operator">&lt;</span><span class="keyword type">double</span><span class="punctuation">,</span><span class="name">std</span><span class="operator">::</span><span class="name">extents</span><span class="operator">&lt;</span><span class="name">std</span><span class="operator">::</span><span class="name">dynamic_extent</span><span class="punctuation">,</span><span class="name">std</span><span class="operator">::</span><span class="name">dynamic_extent</span><span class="punctuation">,</span><span class="name">std</span><span class="operator">::</span><span class="name">dynamic_extent</span><span class="operator">&gt;&gt;</span> <span class="punctuation">;</span>

<span class="comment single">// Three dimensional tensor type declaration with concise syntax
</span>
<span class="keyword">using</span> <span class="name">tensor</span> <span class="operator">=</span> <span class="name">std</span><span class="operator">::</span><span class="name">mdspan</span><span class="operator">&lt;</span><span class="keyword type">double</span><span class="punctuation">[][][]</span><span class="operator">&gt;</span> <span class="punctuation">;</span>
</pre>
<!--  -->
<p>This paper (P0332) is submitted to EWG when P0009 advances from LEWG to LWG.</p>
</div>
<div class="section" id="proposal">
<h1>Proposal</h1>
<p>The current array type declarator constraints are
defined in in <strong>11.3.4.p3</strong> as follows.</p>
<blockquote>
When several “array of” specifications are adjacent,
a multidimensional array type is created;
only the first of the constant expressions
that specify the bounds of the arrays may be omitted.
In addition to declarations in which an
incomplete object type is allowed,
an array bound may be omitted in some cases
in the declaration of a function parameter (11.3.5).
An array bound may also be omitted when the declarator
is followed by an initializer (11.6)
or when a declarator for a static data member
is followed by a brace-or-equal-initializer (12.2).
In both cases the bound is calculated from the
number of initial elements (say, N) supplied (11.6.1),
and the type of the identifier of D is “array of N T”.
Furthermore, if there is a preceding declaration
of the entity in the same scope in which the bound was specified,
an omitted array bound is taken to be the same as in that
earlier declaration, and similarly for the definition of
a static data member of a class.</blockquote>
<p>For <tt class="docutils literal">mdspan</tt> to have a concise and intuitive syntax
the array type declarator constraints must be relaxed.
The following wording change is proposed.</p>
<blockquote>
<p>When several “array of” specifications are adjacent,
a multidimensional array type is created.
In declarations in which an incomplete object type is allowed
any of the constant expressions that
specify the bounds of the arrays may be omitted.
The first of the constant expressions
that specify the bounds of the arrays may be omitted</p>
<blockquote>
<ul class="simple">
<li>in some cases in the declaration of a function parameter (11.3.5),</li>
<li>when the declarator is followed by an initializer (11.6),</li>
<li>when a declarator for a static data member
is followed by a brace-or-equal-initializer (12.2), or</li>
<li>if there is a preceding declaration
of the entity in the same scope in which the bound was specified.</li>
</ul>
</blockquote>
<p>In the initializer cases the bound is calculated from the
number of initial elements (say, N) supplied (11.6.1),
and the type of the identifier of D is “array of N T”.
In the preceding declaration case
an omitted array bound is taken to be the same as in that
earlier declaration, and similarly for the definition of
a static data member of a class.</p>
</blockquote>
</div>
<div class="section" id="precedence-and-feasibility">
<h1>Precedence and Feasibility</h1>
<p>An incomplete array type <tt class="docutils literal">T[]</tt> to concisely indicate
an array of runtime length is used by
<tt class="docutils literal"><span class="pre">std::unique_ptr&lt;T[]&gt;</span></tt> (23.11.1.3),
<tt class="docutils literal"><span class="pre">std::shared_ptr&lt;T&gt;</span></tt> where <tt class="docutils literal">T</tt> is <tt class="docutils literal">U[]</tt> (23.11.2.2),
and P0674 <tt class="docutils literal"><span class="pre">make_shared&lt;T[][N1][N2]&gt;</span></tt>.</p>
<p>This minor language specification change has been implemented with
a trivial (one line) patch to Clang and was permissible in gcc prior to
version 5.</p>
</div>
</div>
</body>
</html>
