title: Is '\u0B95' a multicharacter literal?
body: <p>In <a href="https://stackoverflow.com/a/13546801/150634">a previous answer I gave</a>, I responded to the following warning being caused by the fact that <code>'\u0B95'</code> requires three bytes and so is a <em>multicharacter literal</em>:</p>
  
  <pre><code>warning: multi-character character constant [-Wmultichar]
  </code></pre>
  
  <p>But actually, I don't think I'm right and I don't think gcc is either. The standard states:</p>
  
  <blockquote>
    <p>An ordinary character literal that contains more than one <em>c-char</em> is a <em>multicharacter literal</em>.</p>
  </blockquote>
  
  <p>One production rule for <em>c-char</em> is a <em>universal-character-name</em> (i.e. <code>\uXXXX</code> or <code>\UXXXXXXXX</code>). Since <code>\u0B95</code> is a single <em>c-char</em>, this is not a multicharacter literal. But now it gets messy. The standard also says:</p>
  
  <blockquote>
    <p>An ordinary character literal that contains a single <em>c-char</em> has type <code>char</code>, with value equal to the numerical value of the encoding of the <em>c-char</em> in the execution character set.</p>
  </blockquote>
  
  <p>So my literal has type <code>char</code> and value of the character in the execution character set (or implementation-defined value if it does not exist in that set). <code>char</code> is only defined to be large enough to store any member of the basic character set (which is not actually defined by the standard, but I assume it means the basic execution character set):</p>
  
  <blockquote>
    <p>Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set.</p>
  </blockquote>
  
  <p>Therefore, since the execution character set is a superset of all the values a <code>char</code> can hold, my character may not fit in the <code>char</code>.</p>
  
  <p>So what value <em>does</em> my <code>char</code> have? This doesn't seem to be defined anywhere. The standard does say that for <code>char16_t</code> literals, if the value is not representable, the program is ill-formed. It says nothing about ordinary literals, though.</p>
  
  <p>So what's going on? Is this just a mess in the standard or am I missing something?</p>