#はじめに(Introduction)
C++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
C++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)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。
##作業方針(sequence)
1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。
1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。
C++N4606符号断片編纂一覧(example code compile list)
C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/
編纂器(Compiler)
###clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-apple-darwin17.4.0
###g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
#(277) Annex C (Informative)C.3 C++ and ISO C++ 2011 [diff.cpp11] p1435
##算譜(source code)
// C++N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
#define msg "C++N460(277) Annex C (Informative)C.3 C++ and ISO C++ 2011 [diff.cpp11] p1435.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
// C.3 C++ and ISO C++ 2011 [diff.cpp11]
// C.3.1 Clause 2: lexical conventions [diff.cpp11.lex]
#define M(x, ...) __VA_ARGS__
int x[2] = { M(1'2,3'4) };
// int x[2] = {}; — C++ 2011
// int x[2] = { 3'4 }; — this International Standard
// C.3.2 Clause 3: basic concepts [diff.cpp11.basic]
void* operator new(std::size_t, std::size_t);/// compile error for void only
void operator delete(void*, std::size_t) noexcept;
//C.3.3 Clause 5: expressions [diff.cpp11.expr]
struct S {
int x = 1;
void mf() {
x = 2;
}
};
int f(bool cond) {
S s;
(cond ? s : throw 0).mf();
return s.x;
}
void c33() {
if (sizeof(true ? "" : throw 0)) std::cout <<"sizeof(true ? "" : throw 0) "<<std::endl;
}
//C.3.4 Clause 7: declarations [diff.cpp11.dcl.dcl]
void c34() {
struct S {
constexpr const int &f();
int &f();
};
}
//C.3.5 Clause 8: declarators [diff.cpp11.dcl.decl]
void c35() {
struct S { // Aggregate in C++ 2014 onwards.
int m = 1;
};
struct X {
operator int();
operator S() {};
};
X a{};
S b{a}; // uses copy constructor in C++ 2011,
// performs aggregate initialization in this International Standard
}
int main() {
c33();
c34();
c35();
std::cout<< msg << std::endl;
return EXIT_SUCCESS;
}
##編纂・実行結果(compile and go)
$ ./cppall.sh p1435
$ clang++ p1435.cpp -std=c++03 -Wall
p1435.cpp:18:42: error: expected function body after function declarator
void operator delete(void*, std::size_t) noexcept;
^
p1435.cpp:22:7: warning: in-class initialization of non-static data member is a C++11
extension [-Wc++11-extensions]
int x = 1;
^
p1435.cpp:31:11: warning: expression with side effects has no effect in an unevaluated
context [-Wunevaluated-expression]
if (sizeof(true ? "" : throw 0)) std::cout <<"sizeof(true ? "" : throw 0) "<<std::endl;
^
p1435.cpp:37:1: error: unknown type name 'constexpr'
constexpr const int &f();
^
p1435.cpp:37:11: error: expected member name or ';' after declaration specifiers
constexpr const int &f();
~~~~~~~~~ ^
p1435.cpp:44:7: warning: in-class initialization of non-static data member is a C++11
extension [-Wc++11-extensions]
int m = 1;
^
p1435.cpp:51:4: error: expected ';' at end of declaration
X a{};
^
;
p1435.cpp:52:4: error: expected ';' at end of declaration
S b{a}; // uses copy constructor in C++ 2011,
^
;
3 warnings and 5 errors generated.
$ clang++ p1435.cpp -std=c++11 -Wall
p1435.cpp:31:11: warning: expression with side effects has no effect in an unevaluated
context [-Wunevaluated-expression]
if (sizeof(true ? "" : throw 0)) std::cout <<"sizeof(true ? "" : throw 0) "<<std::endl;
^
p1435.cpp:37:22: warning: 'constexpr' non-static member function will not be implicitly
'const' in C++14; add 'const' to avoid a change in behavior
[-Wconstexpr-not-const]
constexpr const int &f();
^
const
p1435.cpp:49:14: warning: control reaches end of non-void function [-Wreturn-type]
operator S(){};
^
p1435.cpp:52:3: warning: unused variable 'b' [-Wunused-variable]
S b{a}; // uses copy constructor in C++ 2011,
^
4 warnings generated.
sizeof(true ? : throw 0)
./cppall.sh: line 11: 58016 Illegal instruction: 4 ./$1l11 $2
$ clang++ p1435.cpp -std=c++17 -Wall
p1435.cpp:31:11: warning: expression with side effects has no effect in an unevaluated
context [-Wunevaluated-expression]
if (sizeof(true ? "" : throw 0)) std::cout <<"sizeof(true ? "" : throw 0) "<<std::endl;
^
p1435.cpp:38:6: error: functions that differ only in their return type cannot be
overloaded
int &f();
~~~~~^
p1435.cpp:37:22: note: previous declaration is here
constexpr const int &f();
~~~~~^
p1435.cpp:52:3: warning: unused variable 'b' [-Wunused-variable]
S b{a}; // uses copy constructor in C++ 2011,
^
2 warnings and 1 error generated.
$ g++-7 p1435.cpp -std=c++03 -Wall
p1435.cpp:18:1: warning: identifier 'noexcept' is a keyword in C++11 [-Wc++11-compat]
void operator delete(void*, std::size_t) noexcept;
^~~~
p1435.cpp:37:1: warning: identifier 'constexpr' is a keyword in C++11 [-Wc++11-compat]
constexpr const int &f();
^~~~~~~~~
p1435.cpp:18:42: error: expected initializer before 'noexcept'
void operator delete(void*, std::size_t) noexcept;
^~~~~~~~
p1435.cpp:22:9: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
int x = 1;
^
p1435.cpp: In function 'void c34()':
p1435.cpp:37:1: error: 'constexpr' does not name a type
constexpr const int &f();
^~~~~~~~~
p1435.cpp:37:1: note: C++11 'constexpr' only available with -std=c++11 or -std=gnu++11
p1435.cpp: In function 'void c35()':
p1435.cpp:44:9: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
int m = 1;
^
p1435.cpp: In member function 'c35()::X::operator c35()::S()':
p1435.cpp:49:14: warning: no return statement in function returning non-void [-Wreturn-type]
operator S(){};
^
p1435.cpp: In function 'void c35()':
p1435.cpp:51:4: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
X a{};
^
p1435.cpp:52:4: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
S b{a}; // uses copy constructor in C++ 2011,
^
p1435.cpp:52:3: error: in C++98 'b' must be initialized by constructor, not by '{...}'
S b{a}; // uses copy constructor in C++ 2011,
^
$ g++-7 p1435.cpp -std=c++11 -Wall
p1435.cpp: In member function 'c35()::X::operator c35()::S()':
p1435.cpp:49:14: warning: no return statement in function returning non-void [-Wreturn-type]
operator S(){};
^
sizeof(true ? : throw 0)
C++N460(277) Annex C (Informative)C.3 C++ and ISO C++ 2011 [diff.cpp11] p1435.cpp
$ g++-7 p1435.cpp -std=c++17 -Wall
p1435.cpp: In function 'void c34()':
p1435.cpp:38:6: error: 'int& c34()::S::f()' cannot be overloaded
int &f();
^
p1435.cpp:37:22: error: with 'constexpr const int& c34()::S::f()'
constexpr const int &f();
^
p1435.cpp: In member function 'c35()::X::operator c35()::S()':
p1435.cpp:49:14: warning: no return statement in function returning non-void [-Wreturn-type]
operator S(){};
^
p1435.cpp: In function 'void c35()':
p1435.cpp:52:3: warning: unused variable 'b' [-Wunused-variable]
S b{a}; // uses copy constructor in C++ 2011,
^
p1435.cpp: At global scope:
p1435.cpp:48:1: warning: 'c35()::X::operator int()' used but never defined
operator int();
^~~~~~~~
#検討事項(agenda)
-std=c++11でコンパイルエラーにならず、他でコンパイルエラーになる背景の説明
役に立つまたは意味のある出力
#参考資料(reference)
docker gnu(gcc/g++) and llvm(clang/clang++)
https://qiita.com/drafts/059874ea39c4de64c0f7
C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1
コンパイル用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
C++2003とC++2017でコンパイルエラーになるならない事例集
https://qiita.com/kaizen_nagoya/items/a13ea3823441c430edff
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
cpprefjpのdecltypeをコンパイル試験
https://qiita.com/kaizen_nagoya/items/090909af702f0d5d8a67
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
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671
#文書履歴(document history)
ver. 0.10 初稿 20180503