| 
1 |  | -use clippy_utils::{diagnostics::span_lint_and_sugg, match_def_path, paths};  | 
 | 1 | +use clippy_utils::{diagnostics::span_lint_and_sugg, is_ty_alias, match_def_path, paths};  | 
2 | 2 | use hir::{def::Res, ExprKind};  | 
3 | 3 | use rustc_errors::Applicability;  | 
4 | 4 | use rustc_hir as hir;  | 
@@ -43,12 +43,23 @@ declare_clippy_lint! {  | 
43 | 43 | }  | 
44 | 44 | declare_lint_pass!(DefaultConstructedUnitStructs => [DEFAULT_CONSTRUCTED_UNIT_STRUCTS]);  | 
45 | 45 | 
 
  | 
 | 46 | +fn is_alias(ty: hir::Ty<'_>) -> bool {  | 
 | 47 | +    if let hir::TyKind::Path(ref qpath) = ty.kind {  | 
 | 48 | +        is_ty_alias(qpath)  | 
 | 49 | +    } else {  | 
 | 50 | +        false  | 
 | 51 | +    }  | 
 | 52 | +}  | 
 | 53 | + | 
46 | 54 | impl LateLintPass<'_> for DefaultConstructedUnitStructs {  | 
47 | 55 |     fn check_expr<'tcx>(&mut self, cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'tcx>) {  | 
48 | 56 |         if_chain!(  | 
49 | 57 |             // make sure we have a call to `Default::default`  | 
50 | 58 |             if let hir::ExprKind::Call(fn_expr, &[]) = expr.kind;  | 
51 |  | -            if let ExprKind::Path(ref qpath@ hir::QPath::TypeRelative(_,_)) = fn_expr.kind;  | 
 | 59 | +            if let ExprKind::Path(ref qpath @ hir::QPath::TypeRelative(base, _)) = fn_expr.kind;  | 
 | 60 | +            // make sure this isn't a type alias:  | 
 | 61 | +            // `<Foo as Bar>::Assoc` cannot be used as a constructor  | 
 | 62 | +            if !is_alias(*base);  | 
52 | 63 |             if let Res::Def(_, def_id) = cx.qpath_res(qpath, fn_expr.hir_id);  | 
53 | 64 |             if match_def_path(cx, def_id, &paths::DEFAULT_TRAIT_METHOD);  | 
54 | 65 |             // make sure we have a struct with no fields (unit struct)  | 
 | 
0 commit comments