From 7c2752a95be8878ccda118e4536c2d14363d45e4 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Perennou Date: Mon, 6 Feb 2017 18:03:26 +0100 Subject: [PATCH 1/7] rustbuild: support setting verbosity in config.toml Signed-off-by: Marc-Antoine Perennou --- src/bootstrap/config.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 6e077691b3a05..aa2bc38143d5c 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -148,6 +148,7 @@ struct Build { python: Option, full_bootstrap: Option, extended: Option, + verbose: Option, } /// TOML representation of various global install decisions. @@ -292,6 +293,7 @@ impl Config { set(&mut config.vendor, build.vendor); set(&mut config.full_bootstrap, build.full_bootstrap); set(&mut config.extended, build.extended); + set(&mut config.verbose, build.verbose); if let Some(ref install) = toml.install { config.prefix = install.prefix.clone().map(PathBuf::from); From 4268872807cf8bc5c8c435794d1c82d21899d67b Mon Sep 17 00:00:00 2001 From: Marc-Antoine Perennou Date: Mon, 6 Feb 2017 20:47:04 +0100 Subject: [PATCH 2/7] rustbuild: add verbose to config.toml.example Signed-off-by: Marc-Antoine Perennou --- src/bootstrap/config.toml.example | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bootstrap/config.toml.example b/src/bootstrap/config.toml.example index a53419ad7fd78..42bc20c24e569 100644 --- a/src/bootstrap/config.toml.example +++ b/src/bootstrap/config.toml.example @@ -124,6 +124,9 @@ # disabled by default. #extended = false +# Verbosity level: 0 == not verbose, 1 == verbose, 2 == very verbose +#verbose = 0 + # ============================================================================= # General install configuration options # ============================================================================= From 66bd8eede5e79423a7046fa936ab8557c4e323f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Wed, 8 Feb 2017 23:38:41 +0000 Subject: [PATCH 3/7] Fix ICE when parsing token trees after an error. --- src/libsyntax/parse/parser.rs | 13 ++++++++++--- src/test/compile-fail/issue-39388.rs | 17 +++++++++++++++++ src/test/compile-fail/issue-39616.rs | 15 +++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/issue-39388.rs create mode 100644 src/test/compile-fail/issue-39616.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 45d8354d317dc..b051928ff9d3c 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -802,6 +802,10 @@ impl<'a> Parser<'a> { let mut first: bool = true; let mut v = vec![]; while !kets.contains(&&self.token) { + match self.token { + token::CloseDelim(..) | token::Eof => break, + _ => {} + }; match sep.sep { Some(ref t) => { if first { @@ -2608,9 +2612,12 @@ impl<'a> Parser<'a> { return Ok((None, kleene_op)); } - let separator = self.bump_and_get(); + let separator = match self.token { + token::CloseDelim(..) => None, + _ => Some(self.bump_and_get()), + }; match parse_kleene_op(self)? { - Some(zerok) => Ok((Some(separator), zerok)), + Some(zerok) => Ok((separator, zerok)), None => return Err(self.fatal("expected `*` or `+`")) } } @@ -2647,7 +2654,7 @@ impl<'a> Parser<'a> { tts: tts, }))) }, - token::CloseDelim(_) | token::Eof => unreachable!(), + token::CloseDelim(..) | token::Eof => Ok(TokenTree::Token(self.span, token::Eof)), token::Dollar | token::SubstNt(..) if self.quote_depth > 0 => self.parse_unquoted(), _ => Ok(TokenTree::Token(self.span, self.bump_and_get())), } diff --git a/src/test/compile-fail/issue-39388.rs b/src/test/compile-fail/issue-39388.rs new file mode 100644 index 0000000000000..6994d2199d276 --- /dev/null +++ b/src/test/compile-fail/issue-39388.rs @@ -0,0 +1,17 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +macro_rules! assign { + (($($a:tt)*) = ($($b:tt))*) => { //~ ERROR expected `*` or `+` + $($a)* = $($b)* + } +} + +fn main() {} diff --git a/src/test/compile-fail/issue-39616.rs b/src/test/compile-fail/issue-39616.rs new file mode 100644 index 0000000000000..d601249c036b1 --- /dev/null +++ b/src/test/compile-fail/issue-39616.rs @@ -0,0 +1,15 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn foo(a: [0; 1]) {} //~ ERROR expected type, found `0` +//~| ERROR expected one of `->`, `where`, or `{`, found `]` +// FIXME(jseyfried): avoid emitting the second error (preexisting) + +fn main() {} From ca9c7ae61b4bc948e45f7f431c9c27ef87d33cd5 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Thu, 9 Feb 2017 12:07:58 -0500 Subject: [PATCH 4/7] driver: restore partially deleted comment --- src/librustc_driver/driver.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 33bf4d5276adf..4fe3730bbe249 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -1000,6 +1000,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, } /// Run the translation phase to LLVM, after which the AST and analysis can +/// be discarded. pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, analysis: ty::CrateAnalysis, incremental_hashes_map: &IncrementalHashesMap) From ec4a3cc3710eba9b31e003771994e9b13c47c318 Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 9 Feb 2017 19:39:46 +0100 Subject: [PATCH 5/7] Adding compile fail test for const_indexing feature --- .../compile-fail/feature-gate-const-indexing.rs | 17 +++++++++++++++++ src/tools/tidy/src/features.rs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/feature-gate-const-indexing.rs diff --git a/src/test/compile-fail/feature-gate-const-indexing.rs b/src/test/compile-fail/feature-gate-const-indexing.rs new file mode 100644 index 0000000000000..0d61878cd8073 --- /dev/null +++ b/src/test/compile-fail/feature-gate-const-indexing.rs @@ -0,0 +1,17 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +fn main() { + const ARR: [i32; 6] = [42, 43, 44, 45, 46, 47]; + const IDX: usize = 3; + const VAL: i32 = ARR[IDX]; + const BLUB: [i32; (ARR[0] - 41) as usize] = [5]; //~ ERROR constant evaluation error +} diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs index 2c3e57c833262..707d5da50bf73 100644 --- a/src/tools/tidy/src/features.rs +++ b/src/tools/tidy/src/features.rs @@ -167,7 +167,7 @@ pub fn check(path: &Path, bad: &mut bool) { // FIXME get this whitelist empty. let whitelist = vec![ "abi_ptx", "simd", "static_recursion", - "cfg_target_has_atomic", "staged_api", "const_indexing", + "cfg_target_has_atomic", "staged_api", "unboxed_closures", "stmt_expr_attributes", "cfg_target_thread_local", "unwind_attributes", "inclusive_range_syntax" From e626a6807c44d097996b0f32a4e03b105837f9da Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Thu, 9 Feb 2017 22:31:21 +0100 Subject: [PATCH 6/7] name anonymous fn parameters in libcore traits --- src/libcore/fmt/mod.rs | 18 +++++++++--------- src/libcore/ops.rs | 20 ++++++++++---------- src/libcore/str/pattern.rs | 6 +++--- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index eb086c201812a..6c48c29ecd151 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -434,7 +434,7 @@ impl<'a> Display for Arguments<'a> { pub trait Debug { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for an empty format, `{}`. @@ -477,7 +477,7 @@ pub trait Debug { pub trait Display { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `o` character. @@ -524,7 +524,7 @@ pub trait Display { pub trait Octal { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `b` character. @@ -571,7 +571,7 @@ pub trait Octal { pub trait Binary { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `x` character. @@ -619,7 +619,7 @@ pub trait Binary { pub trait LowerHex { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `X` character. @@ -667,7 +667,7 @@ pub trait LowerHex { pub trait UpperHex { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `p` character. @@ -712,7 +712,7 @@ pub trait UpperHex { pub trait Pointer { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `e` character. @@ -755,7 +755,7 @@ pub trait Pointer { pub trait LowerExp { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// Format trait for the `E` character. @@ -798,7 +798,7 @@ pub trait LowerExp { pub trait UpperExp { /// Formats the value using the given formatter. #[stable(feature = "rust1", since = "1.0.0")] - fn fmt(&self, &mut Formatter) -> Result; + fn fmt(&self, f: &mut Formatter) -> Result; } /// The `write` function takes an output stream, a precompiled format string, diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 566fb89365a51..59bcb340ec99a 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -1324,7 +1324,7 @@ shr_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize } pub trait AddAssign { /// The method for the `+=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn add_assign(&mut self, Rhs); + fn add_assign(&mut self, rhs: Rhs); } macro_rules! add_assign_impl { @@ -1380,7 +1380,7 @@ add_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } pub trait SubAssign { /// The method for the `-=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn sub_assign(&mut self, Rhs); + fn sub_assign(&mut self, rhs: Rhs); } macro_rules! sub_assign_impl { @@ -1425,7 +1425,7 @@ sub_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } pub trait MulAssign { /// The method for the `*=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn mul_assign(&mut self, Rhs); + fn mul_assign(&mut self, rhs: Rhs); } macro_rules! mul_assign_impl { @@ -1470,7 +1470,7 @@ mul_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } pub trait DivAssign { /// The method for the `/=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn div_assign(&mut self, Rhs); + fn div_assign(&mut self, rhs: Rhs); } macro_rules! div_assign_impl { @@ -1514,7 +1514,7 @@ div_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } pub trait RemAssign { /// The method for the `%=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn rem_assign(&mut self, Rhs); + fn rem_assign(&mut self, rhs: Rhs); } macro_rules! rem_assign_impl { @@ -1600,7 +1600,7 @@ rem_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } pub trait BitAndAssign { /// The method for the `&=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn bitand_assign(&mut self, Rhs); + fn bitand_assign(&mut self, rhs: Rhs); } macro_rules! bitand_assign_impl { @@ -1644,7 +1644,7 @@ bitand_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 } pub trait BitOrAssign { /// The method for the `|=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn bitor_assign(&mut self, Rhs); + fn bitor_assign(&mut self, rhs: Rhs); } macro_rules! bitor_assign_impl { @@ -1688,7 +1688,7 @@ bitor_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 } pub trait BitXorAssign { /// The method for the `^=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn bitxor_assign(&mut self, Rhs); + fn bitxor_assign(&mut self, rhs: Rhs); } macro_rules! bitxor_assign_impl { @@ -1732,7 +1732,7 @@ bitxor_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 } pub trait ShlAssign { /// The method for the `<<=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn shl_assign(&mut self, Rhs); + fn shl_assign(&mut self, rhs: Rhs); } macro_rules! shl_assign_impl { @@ -1797,7 +1797,7 @@ shl_assign_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize } pub trait ShrAssign { /// The method for the `>>=` operator #[stable(feature = "op_assign_traits", since = "1.8.0")] - fn shr_assign(&mut self, Rhs); + fn shr_assign(&mut self, rhs: Rhs); } macro_rules! shr_assign_impl { diff --git a/src/libcore/str/pattern.rs b/src/libcore/str/pattern.rs index 7dced2ba7514c..8493afe98bc57 100644 --- a/src/libcore/str/pattern.rs +++ b/src/libcore/str/pattern.rs @@ -240,7 +240,7 @@ pub trait DoubleEndedSearcher<'a>: ReverseSearcher<'a> {} #[doc(hidden)] trait CharEq { - fn matches(&mut self, char) -> bool; + fn matches(&mut self, c: char) -> bool; fn only_ascii(&self) -> bool; } @@ -1178,8 +1178,8 @@ impl TwoWaySearcher { trait TwoWayStrategy { type Output; fn use_early_reject() -> bool; - fn rejecting(usize, usize) -> Self::Output; - fn matching(usize, usize) -> Self::Output; + fn rejecting(a: usize, b: usize) -> Self::Output; + fn matching(a: usize, b: usize) -> Self::Output; } /// Skip to match intervals as quickly as possible From 9fffd14171704eb4c2e0f658fc3dcc25f97ccc60 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Thu, 9 Feb 2017 20:37:59 +0000 Subject: [PATCH 7/7] change span_notes to notes in E0368/E0369 --- src/librustc_typeck/check/op.rs | 23 +++++++-------- .../compile-fail/binary-op-on-double-ref.rs | 2 +- src/test/parse-fail/issue-39018.stderr | 28 ------------------- src/test/ui/span/issue-39018.stderr | 12 ++------ 4 files changed, 13 insertions(+), 52 deletions(-) delete mode 100644 src/test/parse-fail/issue-39018.stderr diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index 0dcdab07e6fc8..f492ab12e3f99 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -212,11 +212,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { self.lookup_op_method(expr, ty_mut.ty, vec![rhs_ty_var], Symbol::intern(name), trait_def_id, lhs_expr).is_ok() { - err.span_note( - lhs_expr.span, + err.note( &format!( - "this is a reference of type that `{}` can be applied to, \ - you need to dereference this variable once for this \ + "this is a reference to a type that `{}` can be applied \ + to; you need to dereference this variable once for this \ operation to work", op.node.as_str())); } @@ -244,11 +243,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { rhs_expr, rhs_ty_var, &mut err) { // This has nothing here because it means we did string // concatenation (e.g. "Hello " + "World!"). This means - // we don't want the span in the else clause to be emmitted + // we don't want the note in the else clause to be emitted } else { - span_note!(&mut err, lhs_expr.span, - "an implementation of `{}` might be missing for `{}`", - missing_trait, lhs_ty); + err.note( + &format!("an implementation of `{}` might be missing for `{}`", + missing_trait, lhs_ty)); } } err.emit(); @@ -271,16 +270,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { rhs_expr: &'gcx hir::Expr, rhs_ty_var: Ty<'tcx>, mut err: &mut errors::DiagnosticBuilder) -> bool { - // If this function returns false it means we use it to make sure we print - // out the an "implementation of span_note!" above where this function is - // called and if true we don't. + // If this function returns true it means a note was printed, so we don't need + // to print the normal "implementation of `std::ops::Add` might be missing" note let mut is_string_addition = false; let rhs_ty = self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var); if let TyRef(_, l_ty) = lhs_ty.sty { if let TyRef(_, r_ty) = rhs_ty.sty { if l_ty.ty.sty == TyStr && r_ty.ty.sty == TyStr { - span_note!(&mut err, lhs_expr.span, - "`+` can't be used to concatenate two `&str` strings"); + err.note("`+` can't be used to concatenate two `&str` strings"); let codemap = self.tcx.sess.codemap(); let suggestion = match (codemap.span_to_snippet(lhs_expr.span), diff --git a/src/test/compile-fail/binary-op-on-double-ref.rs b/src/test/compile-fail/binary-op-on-double-ref.rs index a49cfaa17606d..23ca026f541dd 100644 --- a/src/test/compile-fail/binary-op-on-double-ref.rs +++ b/src/test/compile-fail/binary-op-on-double-ref.rs @@ -13,7 +13,7 @@ fn main() { let vr = v.iter().filter(|x| { x % 2 == 0 //~^ ERROR binary operation `%` cannot be applied to type `&&{integer}` - //~| NOTE this is a reference of type that `%` can be applied to + //~| NOTE this is a reference to a type that `%` can be applied to //~| NOTE an implementation of `std::ops::Rem` might be missing for `&&{integer}` }); println!("{:?}", vr); diff --git a/src/test/parse-fail/issue-39018.stderr b/src/test/parse-fail/issue-39018.stderr deleted file mode 100644 index ee1a32c4c16cf..0000000000000 --- a/src/test/parse-fail/issue-39018.stderr +++ /dev/null @@ -1,28 +0,0 @@ -error[E0369]: binary operation `+` cannot be applied to type `&'static str` - --> src/test/ui/span/issue-39018.rs:2:13 - | -2 | let x = "Hello " + "World!"; - | ^^^^^^^^ - | -note: `+` can't be used to concatenate two `&str` strings - --> src/test/ui/span/issue-39018.rs:2:13 - | -2 | let x = "Hello " + "World!"; - | ^^^^^^^^ -help: to_owned() can be used to create an owned `String` from a string reference. This allows concatenation since the `String` is owned. - | let x = "Hello ".to_owned() + "World!"; - -error[E0369]: binary operation `+` cannot be applied to type `World` - --> src/test/ui/span/issue-39018.rs:7:13 - | -7 | let y = World::Hello + World::Goodbye; - | ^^^^^^^^^^^^ - | -note: an implementation of `std::ops::Add` might be missing for `World` - --> src/test/ui/span/issue-39018.rs:7:13 - | -7 | let y = World::Hello + World::Goodbye; - | ^^^^^^^^^^^^ - -error: aborting due to 2 previous errors - diff --git a/src/test/ui/span/issue-39018.stderr b/src/test/ui/span/issue-39018.stderr index a8cc74056ca2c..9d6d4570c6ba6 100644 --- a/src/test/ui/span/issue-39018.stderr +++ b/src/test/ui/span/issue-39018.stderr @@ -4,11 +4,7 @@ error[E0369]: binary operation `+` cannot be applied to type `&'static str` 12 | let x = "Hello " + "World!"; | ^^^^^^^^ | -note: `+` can't be used to concatenate two `&str` strings - --> $DIR/issue-39018.rs:12:13 - | -12 | let x = "Hello " + "World!"; - | ^^^^^^^^ + = note: `+` can't be used to concatenate two `&str` strings help: to_owned() can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left. | let x = "Hello ".to_owned() + "World!"; @@ -18,11 +14,7 @@ error[E0369]: binary operation `+` cannot be applied to type `World` 17 | let y = World::Hello + World::Goodbye; | ^^^^^^^^^^^^ | -note: an implementation of `std::ops::Add` might be missing for `World` - --> $DIR/issue-39018.rs:17:13 - | -17 | let y = World::Hello + World::Goodbye; - | ^^^^^^^^^^^^ + = note: an implementation of `std::ops::Add` might be missing for `World` error: aborting due to 2 previous errors