LoginSignup
0
0

More than 1 year has passed since last update.

10.2 Export declaration [module.interface] C++N4910:2022 (131) p248.cpp

Last updated at Posted at 2022-06-28

はじめに(Introduction)

N4910 Working Draft, Standard for Programming Language C++

n4910は、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)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

<この項は書きかけです。順次追記します。>

背景(back ground)

C/C++でコンパイルエラーが出ると、途方にくれることがしばしばあります。
何回かに1回は、該当するエラーが検索できます。
ただ、条件が違っていて、そこでの修正方法では目的を達成しないこともしばしばです。いろいろな条件のコンパイルエラーとその対応方法について、広く記録することによって、いつか同じエラーに遭遇した時にやくに立つことを目指しています。

この半年の間で、三度、自分のネットでの記録に助けられたことがあります。
また過去に解決できなかった記録を10種類以上、最近になって解決できたことがあります。それは、主に次の3つの情報に基づいています。

https://stackoverflow.com
https://cpprefjp.github.io
http://ja.cppreference.com/

また
https://researchmap.jp/joub9b3my-1797580/#_1797580
に記載したサイトのお世話になっています。

作業方針(sequence)

Clang++では-std=c++03, C++2bの2種類
g++では-std=c++03, c++2bの2種類
でコンパイルし、

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

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

C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list

C++N4606, 2016符号断片編纂一覧(example code compile list)

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

C++N3242, 2011 sample code compile list on clang++ and g++

編纂器(Compiler)

clang++ --version

Debian clang version 14.0.5-++20220610033153+c12386ae247c-1~exp1~20220610153237.151
Target: x86_64-pc-linux-gnu, Thread model: posix, InstalledDir: /usr/bin

g++- --version

g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

10.2 Export declaration [module.interface] C++N4910:2022 (131) p248.cpp

算譜(source code)

p248.cpp
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * n4910 = "10.2 Export declaration [module.interface] C++N4910:2022 (131) p248.cpp";
// Debian clang version 14.0.5-++20220610033153+c12386ae247c-
// g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
// C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
// https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91

#include <iostream>
#include <cstdio>
#include <cstdlib> 
#include <cstring>
#include <cassert>
#include <coroutine>
#include <vector>
#include <complex>
#include <map>
#include <atomic>
#include <unordered_map>

using namespace std;

// Example 1  
Source file "a.h":
export int x;
// Translation unit #1:
module;
#include "a248.h"
export module M;
export namespace {}
export namespace {
int a1;
}
namespace {
         export int a2;
       }
       export static int b;
       export int f();
       export namespace N { }
       export using namespace N;
// error: declaration of x is not in the // purview of a module interface unit
// error: does not introduce any names
// error: export of name with internal linkage
// error: export of name with internal linkage
// error: b explicitly declared static // OK
// OK
// error: does not declare a name
// [Example 2: Source file "b.h":
// int f();
// Importable header "c.h": int g();
// [Example 3:
  export module M;
  struct S;
  export using T = S;
// OK, exports name T denoting type S
// [Example 4:
  export module M;
  struct S { int n; };
  typedef S S;
  export typedef S S;
  export struct S;
// [Example 5: Interface unit of M:
  export module M;
  export struct X {
    static void f();
    struct Y { };
  };
  namespace {
    struct S { };
  }
  export void f(S);
  struct T { };
  export T id(T);
  export struct A;
// OK
// OK
// A exported as incomplete
export auto rootFinder(double a) {
  return [=](double x) { return (x + a/x)/2; };
  }
  export const int n = 5;
// Implementation unit of M:
  module M;
  struct A {
int value; };
// Main program:
import M;
int main() {
    X::f();
    X::Y y;
    auto f = rootFinder(2);
    return A{45}.value;
// OK, n has external linkage
// OK, X is exported and definition of X is reachable // OK, X::Y is exported as a complete type
// OK
// error: A is incomplete
  cout  <<  n4910 << endl;
  return EXIT_SUCCESS;
}
// [Example 6:
  export module M;
  export namespace N {
    int x;
    static_assert(1 == 1);
// OK
// error: does not declare a name
}

// int main(){
//  cout  <<  n4910 << endl;
//  return EXIT_SUCCESS;
//}

Script

clgc.sh
#!/bin/sh
rm $1l
rm $1g
echo "$ clang++ $1.cpp -std=03 -o $1l -I. -Wall" 
clang++ $1.cpp -std=c++03 -o $1l -I. -Wall
if [  -e $1l ]; then
./$1l 
fi
rm $1l
echo "$ clang++ $1.cpp -std=2b -o $1l -I. -Wall"
clang++ $1.cpp -std=c++2b -o $1l -I. -Wall
if [  -e $1l ]; then
./$1l
fi
echo "\r"
echo "$ g++ $1.cpp -std=03 -o $1g -I. -Wall"
g++ $1.cpp -std=c++03 -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g
fi
rm $1g
echo "\r"
echo "$ g++ $1.cpp -std=2b -o $1g -I. -Wall"
g++ $1.cpp -std=c++2b -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g 
fi

編纂・実行結果(compile and go)

bash
# ./clgc.sh  p248
rm: cannot remove 'p248l': No such file or directory
rm: cannot remove 'p248g': No such file or directory
$ clang++ p248.cpp -std=03 -o p248l -I. -Wall
In file included from p248.cpp:19:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/atomic:38:
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/c++0x_warning.h:32:2: error: This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \
 ^
p248.cpp:25:1: error: unknown type name 'Source'
Source file "a.h":
^
p248.cpp:25:12: error: expected ';' after top level declarator
Source file "a.h":
           ^
           ;
p248.cpp:28:1: error: C++ requires a type specifier for all declarations
module;
^
In file included from p248.cpp:29:
./a248.h:4:1: error: unknown type name 'Source'
Source file "a248.h":
^
./a248.h:4:12: error: expected ';' after top level declarator
Source file "a248.h":
           ^
           ;
p248.cpp:30:8: error: expected template
export module M;
       ^
p248.cpp:30:8: error: unknown type name 'module'
p248.cpp:31:8: error: expected template
export namespace {}
       ^
p248.cpp:32:8: error: expected template
export namespace {
       ^
p248.cpp:36:17: error: expected template
         export int a2;
                ^
p248.cpp:38:15: error: expected template
       export static int b;
              ^
p248.cpp:39:15: error: expected template
       export int f();
              ^
p248.cpp:40:15: error: expected template
       export namespace N { }
              ^
p248.cpp:41:15: error: expected template
       export using namespace N;
              ^
p248.cpp:53:10: error: expected template
  export module M;
         ^
p248.cpp:53:10: error: unknown type name 'module'
p248.cpp:55:10: error: expected template
  export using T = S;
         ^
p248.cpp:55:20: warning: alias declarations are a C++11 extension [-Wc++11-extensions]
  export using T = S;
                   ^
p248.cpp:58:10: error: expected template
  export module M;
         ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
1 warning and 20 errors generated.
rm: cannot remove 'p248l': No such file or directory
$ clang++ p248.cpp -std=2b -o p248l -I. -Wall
p248.cpp:25:1: error: unknown type name 'Source'
Source file "a.h":
^
p248.cpp:25:12: error: expected ';' after top level declarator
Source file "a.h":
           ^
           ;
p248.cpp:28:1: error: 'module;' introducing a global module fragment can appear only at the start of the translation unit
module;
^~~~~~~
In file included from p248.cpp:29:
./a248.h:4:1: error: unknown type name 'Source'
Source file "a248.h":
^
./a248.h:4:12: error: expected ';' after top level declarator
Source file "a248.h":
           ^
           ;
p248.cpp:30:8: error: module declaration must occur at the start of the translation unit
export module M;
       ^
p248.cpp:1:1: note: add 'module;' to the start of the file to introduce a global module fragment
// C++N4910 Committee Draft, Standard for Programming Language C++
^
p248.cpp:31:18: warning: ISO C++20 does not permit a declaration that does not introduce any names to be exported [-Wexport-unnamed]
export namespace {}
                 ^
p248.cpp:33:5: error: declaration of 'a1' with internal linkage cannot be exported
int a1;
    ^
p248.cpp:36:10: error: export declaration appears within anonymous namespace
         export int a2;
         ^
p248.cpp:35:11: note: anonymous namespace begins here
namespace {
          ^
p248.cpp:38:26: error: declaration of 'b' with internal linkage cannot be exported
       export static int b;
                         ^
p248.cpp:40:25: warning: ISO C++20 does not permit a declaration that does not introduce any names to be exported [-Wexport-unnamed]
       export namespace N { }
                        ^
p248.cpp:41:31: warning: ISO C++20 does not permit using directive to be exported [-Wexport-using-directive]
       export using namespace N;
                              ^
p248.cpp:53:10: error: translation unit contains multiple module declarations
  export module M;
         ^
p248.cpp:30:8: note: previous module declaration is here
export module M;
       ^
p248.cpp:58:10: error: translation unit contains multiple module declarations
  export module M;
         ^
p248.cpp:30:8: note: previous module declaration is here
export module M;
       ^
p248.cpp:62:17: error: cannot export redeclaration 'S' here since the previous declaration is not exported
  export struct S;
                ^
p248.cpp:59:10: note: previous declaration is here
  struct S { int n; };
         ^
p248.cpp:64:10: error: translation unit contains multiple module declarations
  export module M;
         ^
p248.cpp:30:8: note: previous module declaration is here
export module M;
       ^
p248.cpp:72:17: error: reference to 'S' is ambiguous
  export void f(S);
                ^
p248.cpp:61:20: note: candidate found by name lookup is 'S'
  export typedef S S;
                   ^
p248.cpp:70:12: note: candidate found by name lookup is '(anonymous namespace)::S'
    struct S { };
           ^
p248.cpp:72:17: error: reference to 'S' is ambiguous
  export void f(S);
                ^
p248.cpp:61:20: note: candidate found by name lookup is 'S'
  export typedef S S;
                   ^
p248.cpp:70:12: note: candidate found by name lookup is '(anonymous namespace)::S'
    struct S { };
           ^
p248.cpp:73:10: error: definition of type 'T' conflicts with type alias of the same name
  struct T { };
         ^
p248.cpp:55:16: note: 'T' declared here
  export using T = S;
               ^
p248.cpp:84:3: error: translation unit contains multiple module declarations
  module M;
  ^
p248.cpp:30:8: note: previous module declaration is here
export module M;
       ^
p248.cpp:88:1: error: @import of module 'M' in implementation of 'M'; use #import
import M;
^
p248.cpp:92:10: warning: unused variable 'f' [-Wunused-variable]
    auto f = rootFinder(2);
         ^
p248.cpp:91:10: warning: unused variable 'y' [-Wunused-variable]
    X::Y y;
         ^
p248.cpp:102:10: error: translation unit contains multiple module declarations
  export module M;
         ^
p248.cpp:30:8: note: previous module declaration is here
export module M;
       ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
5 warnings and 20 errors generated.

$ g++ p248.cpp -std=03 -o p248g -I. -Wall
In file included from /usr/local/include/c++/12.1.0/atomic:38,
                 from p248.cpp:19:
/usr/local/include/c++/12.1.0/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
   32 | #error This file requires compiler and library support \
      |  ^~~~~
p248.cpp:105:5: warning: identifier 'static_assert' is a keyword in C++11 [-Wc++11-compat]
  105 |     static_assert(1 == 1);
      |     ^~~~~~~~~~~~~
p248.cpp:25:1: error: 'Source' does not name a type
   25 | Source file "a.h":
      | ^~~~~~
p248.cpp:28:1: error: 'module' does not name a type
   28 | module;
      | ^~~~~~
p248.cpp:28:1: note: C++20 'module' only available with '-fmodules-ts'
In file included from p248.cpp:29:
a248.h:4:1: error: 'Source' does not name a type
    4 | Source file "a248.h":
      | ^~~~~~
p248.cpp:30:1: warning: keyword 'export' not implemented, and will be ignored
   30 | export module M;
      | ^~~~~~
p248.cpp:30:8: error: 'module' does not name a type
   30 | export module M;
      |        ^~~~~~
p248.cpp:30:8: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:31:1: warning: keyword 'export' not implemented, and will be ignored
   31 | export namespace {}
      | ^~~~~~
p248.cpp:32:1: warning: keyword 'export' not implemented, and will be ignored
   32 | export namespace {
      | ^~~~~~
p248.cpp:36:10: warning: keyword 'export' not implemented, and will be ignored
   36 |          export int a2;
      |          ^~~~~~
p248.cpp:38:8: warning: keyword 'export' not implemented, and will be ignored
   38 |        export static int b;
      |        ^~~~~~
p248.cpp:39:8: warning: keyword 'export' not implemented, and will be ignored
   39 |        export int f();
      |        ^~~~~~
p248.cpp:40:8: warning: keyword 'export' not implemented, and will be ignored
   40 |        export namespace N { }
      |        ^~~~~~
p248.cpp:41:8: warning: keyword 'export' not implemented, and will be ignored
   41 |        export using namespace N;
      |        ^~~~~~
p248.cpp:53:3: warning: keyword 'export' not implemented, and will be ignored
   53 |   export module M;
      |   ^~~~~~
p248.cpp:53:10: error: 'module' does not name a type
   53 |   export module M;
      |          ^~~~~~
p248.cpp:53:10: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:55:3: warning: keyword 'export' not implemented, and will be ignored
   55 |   export using T = S;
      |   ^~~~~~
p248.cpp:55:16: error: expected nested-name-specifier before 'T'
   55 |   export using T = S;
      |                ^
p248.cpp:58:3: warning: keyword 'export' not implemented, and will be ignored
   58 |   export module M;
      |   ^~~~~~
p248.cpp:58:10: error: 'module' does not name a type
   58 |   export module M;
      |          ^~~~~~
p248.cpp:58:10: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:61:3: warning: keyword 'export' not implemented, and will be ignored
   61 |   export typedef S S;
      |   ^~~~~~
p248.cpp:62:3: warning: keyword 'export' not implemented, and will be ignored
   62 |   export struct S;
      |   ^~~~~~
p248.cpp:64:3: warning: keyword 'export' not implemented, and will be ignored
   64 |   export module M;
      |   ^~~~~~
p248.cpp:64:10: error: 'module' does not name a type
   64 |   export module M;
      |          ^~~~~~
p248.cpp:64:10: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:65:3: warning: keyword 'export' not implemented, and will be ignored
   65 |   export struct X {
      |   ^~~~~~
p248.cpp:72:3: warning: keyword 'export' not implemented, and will be ignored
   72 |   export void f(S);
      |   ^~~~~~
p248.cpp:72:15: error: variable or field 'f' declared void
   72 |   export void f(S);
      |               ^
p248.cpp:72:17: error: reference to 'S' is ambiguous
   72 |   export void f(S);
      |                 ^
p248.cpp:70:12: note: candidates are: 'struct {anonymous}::S'
   70 |     struct S { };
      |            ^
p248.cpp:61:20: note:                 'typedef struct S S'
   61 |   export typedef S S;
      |                    ^
p248.cpp:74:3: warning: keyword 'export' not implemented, and will be ignored
   74 |   export T id(T);
      |   ^~~~~~
p248.cpp:75:3: warning: keyword 'export' not implemented, and will be ignored
   75 |   export struct A;
      |   ^~~~~~
p248.cpp:79:1: warning: keyword 'export' not implemented, and will be ignored
   79 | export auto rootFinder(double a) {
      | ^~~~~~
p248.cpp:79:8: warning: 'auto' changes meaning in C++11; please remove it [-Wc++11-compat]
   79 | export auto rootFinder(double a) {
      |        ^~~~
      |        ----
p248.cpp:79:13: error: ISO C++ forbids declaration of 'rootFinder' with no type [-fpermissive]
   79 | export auto rootFinder(double a) {
      |             ^~~~~~~~~~
p248.cpp:79:8: error: top-level declaration of 'rootFinder' specifies 'auto'
   79 | export auto rootFinder(double a) {
      |        ^~~~
p248.cpp:79:8: error: storage class 'auto' invalid for function 'rootFinder'
p248.cpp: In function 'int rootFinder(double)':
p248.cpp:80:46: warning: lambda expressions only available with '-std=c++11' or '-std=gnu++11' [-Wc++11-extensions]
   80 |   return [=](double x) { return (x + a/x)/2; };
      |                                              ^
p248.cpp:80:10: error: cannot convert 'rootFinder(double)::<lambda(double)>' to 'int' in return
   80 |   return [=](double x) { return (x + a/x)/2; };
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |          |
      |          rootFinder(double)::<lambda(double)>
p248.cpp: At global scope:
p248.cpp:82:3: warning: keyword 'export' not implemented, and will be ignored
   82 |   export const int n = 5;
      |   ^~~~~~
p248.cpp:84:3: error: 'module' does not name a type
   84 |   module M;
      |   ^~~~~~
p248.cpp:84:3: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:88:1: error: 'import' does not name a type
   88 | import M;
      | ^~~~~~
p248.cpp:88:1: note: C++20 'import' only available with '-fmodules-ts'
p248.cpp: In function 'int main()':
p248.cpp:92:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++11-compat]
   92 |     auto f = rootFinder(2);
      |     ^~~~
      |     ----
p248.cpp:92:10: error: 'f' does not name a type
   92 |     auto f = rootFinder(2);
      |          ^
p248.cpp:93:13: warning: extended initializer lists only available with '-std=c++11' or '-std=gnu++11' [-Wc++11-extensions]
   93 |     return A{45}.value;
      |             ^
p248.cpp:91:10: warning: unused variable 'y' [-Wunused-variable]
   91 |     X::Y y;
      |          ^
p248.cpp: At global scope:
p248.cpp:102:3: warning: keyword 'export' not implemented, and will be ignored
  102 |   export module M;
      |   ^~~~~~
p248.cpp:102:10: error: 'module' does not name a type
  102 |   export module M;
      |          ^~~~~~
p248.cpp:102:10: note: C++20 'module' only available with '-fmodules-ts'
p248.cpp:103:3: warning: keyword 'export' not implemented, and will be ignored
  103 |   export namespace N {
      |   ^~~~~~
p248.cpp:105:18: error: expected constructor, destructor, or type conversion before '(' token
  105 |     static_assert(1 == 1);
      |                  ^
p248.cpp:38:26: warning: 'b' defined but not used [-Wunused-variable]
   38 |        export static int b;
      |                          ^
p248.cpp:36:21: warning: '{anonymous}::a2' defined but not used [-Wunused-variable]
   36 |          export int a2;
      |                     ^~
p248.cpp:33:5: warning: '{anonymous}::a1' defined but not used [-Wunused-variable]
   33 | int a1;
      |     ^~
rm: cannot remove 'p248g': No such file or directory

$ g++ p248.cpp -std=2b -o p248g -I. -Wall
p248.cpp:25:1: error: 'Source' does not name a type
   25 | Source file "a.h":
      | ^~~~~~
p248.cpp:28:1: error: 'module' does not name a type
   28 | module;
      | ^~~~~~
p248.cpp:28:1: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
In file included from p248.cpp:29:
a248.h:4:1: error: 'Source' does not name a type
    4 | Source file "a248.h":
      | ^~~~~~
p248.cpp:30:1: warning: keyword 'export' is enabled with '-fmodules-ts'
   30 | export module M;
      | ^~~~~~
p248.cpp:30:8: error: 'module' does not name a type
   30 | export module M;
      |        ^~~~~~
p248.cpp:30:8: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:31:1: warning: keyword 'export' is enabled with '-fmodules-ts'
   31 | export namespace {}
      | ^~~~~~
p248.cpp:32:1: warning: keyword 'export' is enabled with '-fmodules-ts'
   32 | export namespace {
      | ^~~~~~
p248.cpp:36:10: warning: keyword 'export' is enabled with '-fmodules-ts'
   36 |          export int a2;
      |          ^~~~~~
p248.cpp:38:8: warning: keyword 'export' is enabled with '-fmodules-ts'
   38 |        export static int b;
      |        ^~~~~~
p248.cpp:39:8: warning: keyword 'export' is enabled with '-fmodules-ts'
   39 |        export int f();
      |        ^~~~~~
p248.cpp:40:8: warning: keyword 'export' is enabled with '-fmodules-ts'
   40 |        export namespace N { }
      |        ^~~~~~
p248.cpp:41:8: warning: keyword 'export' is enabled with '-fmodules-ts'
   41 |        export using namespace N;
      |        ^~~~~~
p248.cpp:53:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   53 |   export module M;
      |   ^~~~~~
p248.cpp:53:10: error: 'module' does not name a type
   53 |   export module M;
      |          ^~~~~~
p248.cpp:53:10: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:55:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   55 |   export using T = S;
      |   ^~~~~~
p248.cpp:58:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   58 |   export module M;
      |   ^~~~~~
p248.cpp:58:10: error: 'module' does not name a type
   58 |   export module M;
      |          ^~~~~~
p248.cpp:58:10: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:61:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   61 |   export typedef S S;
      |   ^~~~~~
p248.cpp:62:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   62 |   export struct S;
      |   ^~~~~~
p248.cpp:64:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   64 |   export module M;
      |   ^~~~~~
p248.cpp:64:10: error: 'module' does not name a type
   64 |   export module M;
      |          ^~~~~~
p248.cpp:64:10: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:65:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   65 |   export struct X {
      |   ^~~~~~
p248.cpp:72:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   72 |   export void f(S);
      |   ^~~~~~
p248.cpp:72:15: error: variable or field 'f' declared void
   72 |   export void f(S);
      |               ^
p248.cpp:72:17: error: reference to 'S' is ambiguous
   72 |   export void f(S);
      |                 ^
p248.cpp:70:12: note: candidates are: 'struct {anonymous}::S'
   70 |     struct S { };
      |            ^
p248.cpp:61:20: note:                 'typedef struct S S'
   61 |   export typedef S S;
      |                    ^
p248.cpp:73:10: error: using typedef-name 'using T = struct S' after 'struct'
   73 |   struct T { };
      |          ^
p248.cpp:55:16: note: 'using T = struct S' has a previous declaration here
   55 |   export using T = S;
      |                ^
p248.cpp:74:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   74 |   export T id(T);
      |   ^~~~~~
p248.cpp:75:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   75 |   export struct A;
      |   ^~~~~~
p248.cpp:79:1: warning: keyword 'export' is enabled with '-fmodules-ts'
   79 | export auto rootFinder(double a) {
      | ^~~~~~
p248.cpp:82:3: warning: keyword 'export' is enabled with '-fmodules-ts'
   82 |   export const int n = 5;
      |   ^~~~~~
p248.cpp:84:3: error: 'module' does not name a type
   84 |   module M;
      |   ^~~~~~
p248.cpp:84:3: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:88:1: error: 'import' does not name a type
   88 | import M;
      | ^~~~~~
p248.cpp:88:1: note: C++20 'import' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp: In function 'int main()':
p248.cpp:91:10: warning: unused variable 'y' [-Wunused-variable]
   91 |     X::Y y;
      |          ^
p248.cpp: At global scope:
p248.cpp:102:3: warning: keyword 'export' is enabled with '-fmodules-ts'
  102 |   export module M;
      |   ^~~~~~
p248.cpp:102:10: error: 'module' does not name a type
  102 |   export module M;
      |          ^~~~~~
p248.cpp:102:10: note: C++20 'module' only available with '-fmodules-ts', which is not yet enabled with '-std=c++20'
p248.cpp:103:3: warning: keyword 'export' is enabled with '-fmodules-ts'
  103 |   export namespace N {
      |   ^~~~~~
p248.cpp:38:26: warning: 'b' defined but not used [-Wunused-variable]
   38 |        export static int b;
      |                          ^
p248.cpp:36:21: warning: '{anonymous}::a2' defined but not used [-Wunused-variable]
   36 |          export int a2;
      |                     ^~
p248.cpp:33:5: warning: '{anonymous}::a1' defined but not used [-Wunused-variable]
   33 | int a1;
      |     ^~

検討事項(agenda)

コンパイルエラーの理由を解説する。

<|--コンパイルエラーを取るか、コンパイルエラーの理由を解説する。-->

参考資料(reference)

cpprefjp - C++日本語リファレンス

コンパイラの実装状況

typedef は C++11 ではオワコン

C99からC++14を駆け抜けるC++講座

自己参照(self reference)

C++ Error Message Collection(1)does not name a type, 11 articles

dockerにclang

docker gnu(gcc/g++) and llvm(clang/clang++)

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)

Compare the contents of C++N4910:2022, C++N4741:2018 and C++N4606:2015

C++ sample list

clang++, g++コンパイルエラー方針の違いの例

astyle 使ってみた

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.01 初稿  20220628

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0