C++ N4606(75) 7.2 Enumeration declarations [dcl.enum] p174

#はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM）との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

##作業方針
１）コンパイルエラーを収集する。
２）コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
３）リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
４）意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。

１）だけのものから４）まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/


## Compiler
###clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

###g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

#(75)7.2 Enumeration declarations [dcl.enum]
p174


```c++:p174.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p174.cpp(75)7.2 Enumeration declarations [dcl.enum]"

#include <iostream>

struct S {
  enum E : int {};
  enum E : int {}; // error: redeclaration of enumeration
};
enum { a, b, c=0 };
enum { d, e, f=e+2 };
enum color { red, yellow, green=20, blue };
color col = red;
color* cp = &col;

// this code move int main.

// integral promotion
enum class Col { red, yellow, green };
int x = Col::red; // error: no Col to int conversion
Col y = Col::red;
if (y) { } // error: no Col to bool conversion
enum direction { left=’l’, right=’r’ };
void g() {
  direction d; // OK
  d = left; // OK
  d = direction::right; // OK
}
enum class altitude { high=’h’, low=’l’ };
void h() {
  altitude a; // OK
  a = high; // error: high not in scope
  a = altitude::low; // OK
}
struct X {
  enum direction { left=’l’, right=’r’ };
  int f(int i) { return i==left ? 0 : i==right ? 1 : 2; }
};
void g(X* p) {
  direction d; // error: direction not in scope
int i;
  i = p->f(left); // error: left not in scope
  i = p->f(X::right); // OK
  i = p->f(p->left); // OK
// ...
}
int main(){
  if (*cp == blue) // ...
    color c = 1; // error: type mismatch,
// no conversion from int to color
  int i = yellow; // OK: yellow converted to integral value 1
  std::cout <<"*cp"<<*cp<<"c"<<c<<std::endl;
  std::cout<< msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
$ ./cppgl17.sh p174
$ clang++ p174.cpp
p174.cpp:9:8: error: redefinition of 'E'
  enum E : int {}; // error: redeclaration of enumeration
       ^
p174.cpp:8:8: note: previous definition is here
  enum E : int {};
       ^
p174.cpp:18:5: error: cannot initialize a variable of type 'int' with an rvalue of type 'Col'
int x = Col::red; // error: no Col to int conversion
    ^   ~~~~~~~~
p174.cpp:20:1: error: expected unqualified-id
if (y) { } // error: no Col to bool conversion
^
p174.cpp:21:23: error: non-ASCII characters are not allowed outside of literals and identifiers
enum direction { left=’l’, right=’r’ };
                      ^
p174.cpp:21:27: error: non-ASCII characters are not allowed outside of literals and identifiers
enum direction { left=’l’, right=’r’ };
                        ^
p174.cpp:21:26: error: use of undeclared identifier 'l'
enum direction { left=’l’, right=’r’ };
                       ^
p174.cpp:21:38: error: non-ASCII characters are not allowed outside of literals and identifiers
enum direction { left=’l’, right=’r’ };
                                 ^
p174.cpp:21:42: error: non-ASCII characters are not allowed outside of literals and identifiers
enum direction { left=’l’, right=’r’ };
                                   ^
p174.cpp:21:41: error: use of undeclared identifier 'r'
enum direction { left=’l’, right=’r’ };
                                  ^
p174.cpp:27:28: error: non-ASCII characters are not allowed outside of literals and identifiers
enum class altitude { high=’h’, low=’l’ };
                           ^
p174.cpp:27:32: error: non-ASCII characters are not allowed outside of literals and identifiers
enum class altitude { high=’h’, low=’l’ };
                             ^
p174.cpp:27:31: error: use of undeclared identifier 'h'
enum class altitude { high=’h’, low=’l’ };
                            ^
p174.cpp:27:41: error: non-ASCII characters are not allowed outside of literals and identifiers
enum class altitude { high=’h’, low=’l’ };
                                    ^
p174.cpp:27:45: error: non-ASCII characters are not allowed outside of literals and identifiers
enum class altitude { high=’h’, low=’l’ };
                                      ^
p174.cpp:27:44: error: use of undeclared identifier 'l'
enum class altitude { high=’h’, low=’l’ };
                                     ^
p174.cpp:30:7: error: use of undeclared identifier 'high'
  a = high; // error: high not in scope
      ^
p174.cpp:34:25: error: non-ASCII characters are not allowed outside of literals and identifiers
  enum direction { left=’l’, right=’r’ };
                        ^
p174.cpp:34:29: error: non-ASCII characters are not allowed outside of literals and identifiers
  enum direction { left=’l’, right=’r’ };
                          ^
p174.cpp:34:28: error: use of undeclared identifier 'l'
  enum direction { left=’l’, right=’r’ };
                         ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.

$ g++-7 p174.cpp
p174.cpp:21:23: error: stray '\342' in program
 enum direction { left=???l’, right=’r’ };
                       ^
p174.cpp:21:24: error: stray '\200' in program
 enum direction { left=???l’, right=’r’ };
                        ^
p174.cpp:21:25: error: stray '\231' in program
 enum direction { left=??l’, right=’r’ };
                         ^
p174.cpp:21:27: error: stray '\342' in program
 enum direction { left=’l???, right=’r’ };
                           ^
p174.cpp:21:28: error: stray '\200' in program
 enum direction { left=’l???, right=’r’ };
                            ^
p174.cpp:21:29: error: stray '\231' in program
 enum direction { left=’l??, right=’r’ };
                             ^
p174.cpp:21:38: error: stray '\342' in program
 enum direction { left=’l’, right=???r’ };
                                      ^
p174.cpp:21:39: error: stray '\200' in program
 enum direction { left=’l’, right=???r’ };
                                       ^
p174.cpp:21:40: error: stray '\231' in program
 enum direction { left=’l’, right=??r’ };
                                        ^
p174.cpp:21:42: error: stray '\342' in program
 enum direction { left=’l’, right=’r??? };
                                          ^
p174.cpp:21:43: error: stray '\200' in program
 enum direction { left=’l’, right=’r??? };
                                           ^
p174.cpp:21:44: error: stray '\231' in program
 enum direction { left=’l’, right=’r?? };
                                            ^
p174.cpp:27:28: error: stray '\342' in program
 enum class altitude { high=???h’, low=’l’ };
                            ^
p174.cpp:27:29: error: stray '\200' in program
 enum class altitude { high=???h’, low=’l’ };
                             ^
p174.cpp:27:30: error: stray '\231' in program
 enum class altitude { high=??h’, low=’l’ };
                              ^
p174.cpp:27:32: error: stray '\342' in program
 enum class altitude { high=’h???, low=’l’ };
                                ^
p174.cpp:27:33: error: stray '\200' in program
 enum class altitude { high=’h???, low=’l’ };
                                 ^
p174.cpp:27:34: error: stray '\231' in program
 enum class altitude { high=’h??, low=’l’ };
                                  ^
p174.cpp:27:41: error: stray '\342' in program
 enum class altitude { high=’h’, low=???l’ };
                                         ^
p174.cpp:27:42: error: stray '\200' in program
 enum class altitude { high=’h’, low=???l’ };
                                          ^
p174.cpp:27:43: error: stray '\231' in program
 enum class altitude { high=’h’, low=??l’ };
                                           ^
p174.cpp:27:45: error: stray '\342' in program
 enum class altitude { high=’h’, low=’l??? };
                                             ^
p174.cpp:27:46: error: stray '\200' in program
 enum class altitude { high=’h’, low=’l??? };
                                              ^
p174.cpp:27:47: error: stray '\231' in program
 enum class altitude { high=’h’, low=’l?? };
                                               ^
p174.cpp:34:25: error: stray '\342' in program
   enum direction { left=???l’, right=’r’ };
                         ^
p174.cpp:34:26: error: stray '\200' in program
   enum direction { left=???l’, right=’r’ };
                          ^
p174.cpp:34:27: error: stray '\231' in program
   enum direction { left=??l’, right=’r’ };
                           ^
p174.cpp:34:29: error: stray '\342' in program
   enum direction { left=’l???, right=’r’ };
                             ^
p174.cpp:34:30: error: stray '\200' in program
   enum direction { left=’l???, right=’r’ };
                              ^
p174.cpp:34:31: error: stray '\231' in program
   enum direction { left=’l??, right=’r’ };
                               ^
p174.cpp:34:40: error: stray '\342' in program
   enum direction { left=’l’, right=???r’ };
                                        ^
p174.cpp:34:41: error: stray '\200' in program
   enum direction { left=’l’, right=???r’ };
                                         ^
p174.cpp:34:42: error: stray '\231' in program
   enum direction { left=’l’, right=??r’ };
                                          ^
p174.cpp:34:44: error: stray '\342' in program
   enum direction { left=’l’, right=’r??? };
                                            ^
p174.cpp:34:45: error: stray '\200' in program
   enum direction { left=’l’, right=’r??? };
                                             ^
p174.cpp:34:46: error: stray '\231' in program
   enum direction { left=’l’, right=’r?? };
                                              ^
p174.cpp:9:8: error: multiple definition of 'enum S::E'
   enum E : int {}; // error: redeclaration of enumeration
        ^
p174.cpp:8:8: note: previous definition here
   enum E : int {};
        ^
p174.cpp:18:14: error: cannot convert 'Col' to 'int' in initialization
 int x = Col::red; // error: no Col to int conversion
              ^~~
p174.cpp:20:1: error: expected unqualified-id before 'if'
 if (y) { } // error: no Col to bool conversion
 ^~
p174.cpp:21:26: error: 'l' was not declared in this scope
 enum direction { left=’l’, right=’r’ };
                          ^
p174.cpp:21:41: error: 'r' was not declared in this scope
 enum direction { left=’l’, right=’r’ };
                                         ^
p174.cpp:27:31: error: 'h' was not declared in this scope
 enum class altitude { high=’h’, low=’l’ };
                               ^
p174.cpp:27:44: error: 'l' was not declared in this scope
 enum class altitude { high=’h’, low=’l’ };
                                            ^
p174.cpp: In function 'void h()':
p174.cpp:30:7: error: 'high' was not declared in this scope
   a = high; // error: high not in scope
       ^~~~
p174.cpp:30:7: note: suggested alternative: 'right'
   a = high; // error: high not in scope
       ^~~~
       right
p174.cpp: At global scope:
p174.cpp:34:28: error: 'l' was not declared in this scope
   enum direction { left=’l’, right=’r’ };
                            ^
p174.cpp:34:43: error: 'r' was not declared in this scope
   enum direction { left=’l’, right=’r’ };
                                           ^
p174.cpp: In function 'int main()':
p174.cpp:47:15: error: invalid conversion from 'int' to 'color' [-fpermissive]
     color c = 1; // error: type mismatch,
               ^
```

#検討事項
コンパイルエラーをなくす修正。

#参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed


ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語（C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

#文書履歴
0.10 初稿 2080417