public:
/* Read and write module. */
- void write_begin (elf_out *to, cpp_reader *,
+ bool write_begin (elf_out *to, cpp_reader *,
module_state_config &, unsigned &crc);
void write_end (elf_out *to, cpp_reader *,
module_state_config &, unsigned &crc);
MOD_SNAME_PFX.cfg : config data
*/
-void
+bool
module_state::write_begin (elf_out *to, cpp_reader *reader,
module_state_config &config, unsigned &crc)
{
table.find_dependencies (this);
if (!table.finalize_dependencies ())
- {
- to->set_error ();
- return;
- }
+ return false;
#if CHECKING_P
/* We're done verifying at-most once reading, reset to verify
// so-controlled.
if (false)
write_env (to);
+
+ return true;
}
// Finish module writing after we've emitted all dynamic initializers.
cookie = new module_processing_cookie (cmi_name, tmp_name, fd, e);
- if (errorcount
- /* Don't write the module if it contains an erroneous template. */
- || (erroneous_templates
- && !erroneous_templates->is_empty ()))
- warning_at (state->loc, 0, "not writing module %qs due to errors",
- state->get_flatname ());
+ if (errorcount)
+ /* Don't write the module if we have reported errors. */;
+ else if (erroneous_templates
+ && !erroneous_templates->is_empty ())
+ {
+ /* Don't write the module if it contains an erroneous template.
+ Also emit notes about where errors occurred in case
+ -Wno-template-body was passed. */
+ auto_diagnostic_group d;
+ error_at (state->loc, "not writing module %qs due to errors "
+ "in template bodies", state->get_flatname ());
+ if (!warn_template_body)
+ inform (state->loc, "enable %<-Wtemplate-body%> for more details");
+ for (auto e : *erroneous_templates)
+ inform (e.second, "first error in %qD appeared here", e.first);
+ }
else if (cookie->out.begin ())
{
- cookie->began = true;
- auto loc = input_location;
/* So crashes finger-point the module decl. */
- input_location = state->loc;
- state->write_begin (&cookie->out, reader, cookie->config, cookie->crc);
- input_location = loc;
+ iloc_sentinel ils = state->loc;
+ if (state->write_begin (&cookie->out, reader, cookie->config,
+ cookie->crc))
+ cookie->began = true;
}
dump.pop (n);
extern "C++" int foo ();
extern "C++" int bar (); // { dg-error "ambiguating new declaration" }
-
-// { dg-prune-output "not writing module" }
export module thing;
int i;
import baz; // { dg-error "must be contiguous" }
-
-// { dg-prune-output "not writing module" }
import baz; // { dg-error "must be contiguous" }
int i;
-
-// { dg-prune-output "not writing module" }
# 8 "" 2
import kevin; // ok
-// { dg-prune-output "not writing module" }
};
return X{};
}
-
-// { dg-prune-output "failed to write compiled module" }
class import {};
import x; // { dg-error "post-module-declaration" }
- // { dg-prune-output "not writing module" }
namespace std {
enum class align_val_t : decltype(sizeof(int)) {}; // { dg-error "in module .foo. conflicts with builtin" }
}
-
-// { dg-prune-output "not writing module" }
export // { dg-error "not part of following" }
#include "exp-xlate-1_a.H" // { dg-error "must be contiguous" }
-// { dg-prune-output {not writing module} }
template <typename T> struct B;
export template <typename T> struct B {}; // { dg-error "conflicting exporting for declaration" }
-
-// { dg-warning "due to errors" "" { target *-*-* } 0 }
}
export namespace {} // { dg-error "internal linkage" }
-
-// { dg-prune-output "not writing module" }
void toto (); // not exported
}
-// { dg-prune-output "not writing module" }
B() { object.value = 42; }
A object;
};
-// { dg-prune-output "not writing module" }
// { dg-additional-options "-fmodules-ts -fmodule-mapper=|@g++-mapper-server\\ -t\\ [srcdir]/inc-xlate-1.map" }
export module bad;
#include "inc-xlate-1_a.H" // { dg-error "not be include-translated" }
-
-// { dg-prune-output "not writing module" }
// { dg-additional-options "-fmodules-ts" }
-export module frob; // { dg-error "failed to write" }
+export module frob;
// { dg-module-cmi !frob }
namespace {
// here is an exposure of this type, so this should be an error; we don't yet
// implement this checking however.
struct {} s; // { dg-error "TU-local" "" { xfail *-*-* } }
-
-// { dg-prune-output "not writing module" }
{
extern int bob; // { dg-error "block-scope extern" }
}
-
-
-// { dg-prune-output "not writing module" }
// { dg-additional-options "-fmodules-ts" }
-// { dg-prune-output "not writing module" }
export module M;
int main() {} // { dg-error "attach" }
export module foo;
// { dg-error "Interface: no such module" "" { target *-*-* } .-1 }
// { dg-error "failed reading mapper" "" { target *-*-* } 0 }
-
-// { dg-prune-output "not writing module" }
module a.; // { dg-error "only permitted as" }
-// { dg-prune-output "not writing module" }
-
import // { dg-error "does not name" }
ben;
}
-
-// { dg-prune-output "not writing module" }
--- /dev/null
+// { dg-additional-options "-fmodules-ts -fpermissive" }
+// { dg-module-cmi !M }
+
+export module M; // { dg-error "not writing module" }
+
+template <typename T> void f() {
+ const int n = 42;
+ ++n; // { dg-warning "read-only" }
+ // { dg-message "appeared here" "" { target *-*-* } .-1 }
+}
--- /dev/null
+// { dg-additional-options "-fmodules-ts -Wno-template-body" }
+// { dg-module-cmi !M }
+
+export module M; // { dg-error "not writing module" }
+
+template <typename T> void f() {
+ const int n = 42;
+ ++n; // { dg-message "appeared here" }
+}
+
+// { dg-message "enable \[^\n\r\]* for more details" "" { target *-*-* } 0 }
// { dg-additional-options -fmodule-header }
// { dg-module-cmi !{} }
import "pr99174.H"; // { dg-error "cannot import" }
-
-// { dg-prune-output {not writing module} }
module M; // { dg-error "module-declaration not permitted" }
int i;
-// { dg-prune-output "not writing" }
export module bob; // { dg-error "cannot be in included file" }
# 6 "" 2
// { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
export module bob; // { dg-error "in included file" }
# 6 "" 2
// { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
#define MODULE module // { dg-error "does not name a type" }
export MODULE bob; // { dg-error "may only occur after" }
// { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
export module frob;
// { dg-module-cmi !frob }
-// { dg-prune-output "not writing module" }
export using t::a; // { dg-error "does not have external linkage" }
export using t::b; // { dg-error "does not have external linkage" }
export using t::c; // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
export using t::b; // { dg-error "does not have external linkage" }
export using t::c; // { dg-error "does not have external linkage" }
}
-
-// { dg-prune-output "not writing module" }
export using N::foo; // { dg-error "does not have external linkage" }
export using N::bar; // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
}
export using outer::any_of; // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
export using enum s::e2; // { dg-error "does not have external linkage" }
export using enum m::e3; // { dg-error "does not have external linkage" }
export using enum m::e4; // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }