In the validators, translate obsolete macro aliases (Lp, Ot, LP, P)
authorschwarze <schwarze@openbsd.org>
Mon, 3 Dec 2018 21:00:06 +0000 (21:00 +0000)
committerschwarze <schwarze@openbsd.org>
Mon, 3 Dec 2018 21:00:06 +0000 (21:00 +0000)
to the standard forms (Pp, Ft, PP) up front, such that later code
does not need to look for the obsolete versions.
This reduces the risk of incomplete handling.

regress/usr.bin/mandoc/man/PP/args.out_lint
usr.bin/mandoc/man_html.c
usr.bin/mandoc/man_term.c
usr.bin/mandoc/man_validate.c
usr.bin/mandoc/mdoc_html.c
usr.bin/mandoc/mdoc_man.c
usr.bin/mandoc/mdoc_markdown.c
usr.bin/mandoc/mdoc_term.c
usr.bin/mandoc/mdoc_validate.c

index c757d51..e222de8 100644 (file)
@@ -1,3 +1,3 @@
 mandoc: args.in:7:2: ERROR: skipping all arguments: PP arg
-mandoc: args.in:9:2: ERROR: skipping all arguments: LP arg1 ...
-mandoc: args.in:11:2: ERROR: skipping all arguments: P arg
+mandoc: args.in:9:2: ERROR: skipping all arguments: PP arg1 ...
+mandoc: args.in:11:2: ERROR: skipping all arguments: PP arg
index f23a0bd..bba005d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_html.c,v 1.110 2018/10/23 17:17:54 schwarze Exp $ */
+/*     $OpenBSD: man_html.c,v 1.111 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -61,6 +61,7 @@ static        int               man_SM_pre(MAN_ARGS);
 static int               man_SS_pre(MAN_ARGS);
 static int               man_SY_pre(MAN_ARGS);
 static int               man_UR_pre(MAN_ARGS);
+static int               man_abort_pre(MAN_ARGS);
 static int               man_alt_pre(MAN_ARGS);
 static int               man_ign_pre(MAN_ARGS);
 static int               man_in_pre(MAN_ARGS);
@@ -75,9 +76,9 @@ static        const struct man_html_act man_html_acts[MAN_MAX - MAN_TH] = {
        { man_SS_pre, NULL }, /* SS */
        { man_IP_pre, NULL }, /* TP */
        { man_IP_pre, NULL }, /* TQ */
-       { man_PP_pre, NULL }, /* LP */
+       { man_abort_pre, NULL }, /* LP */
        { man_PP_pre, NULL }, /* PP */
-       { man_PP_pre, NULL }, /* P */
+       { man_abort_pre, NULL }, /* P */
        { man_IP_pre, NULL }, /* IP */
        { man_HP_pre, NULL }, /* HP */
        { man_SM_pre, NULL }, /* SM */
@@ -232,10 +233,8 @@ print_man_node(MAN_ARGS)
                        want_fillmode = MAN_fi;
                        /* FALLTHROUGH */
                case MAN_PP:  /* These have no head.            */
-               case MAN_LP:  /* They will simply               */
-               case MAN_P:   /* reopen .nf in the body.        */
-               case MAN_RS:
-               case MAN_UR:
+               case MAN_RS:  /* They will simply               */
+               case MAN_UR:  /* reopen .nf in the body.        */
                case MAN_MT:
                        fillmode(h, MAN_fi);
                        break;
@@ -670,3 +669,9 @@ man_UR_pre(MAN_ARGS)
 
        return 0;
 }
+
+static int
+man_abort_pre(MAN_ARGS)
+{
+       abort();
+}
index 4d46678..06de244 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_term.c,v 1.173 2018/08/26 16:18:38 schwarze Exp $ */
+/*     $OpenBSD: man_term.c,v 1.174 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -79,6 +79,7 @@ static        int               pre_SS(DECL_ARGS);
 static int               pre_SY(DECL_ARGS);
 static int               pre_TP(DECL_ARGS);
 static int               pre_UR(DECL_ARGS);
+static int               pre_abort(DECL_ARGS);
 static int               pre_alternate(DECL_ARGS);
 static int               pre_ign(DECL_ARGS);
 static int               pre_in(DECL_ARGS);
@@ -99,9 +100,9 @@ static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = {
        { pre_SS, post_SS, 0 }, /* SS */
        { pre_TP, post_TP, 0 }, /* TP */
        { pre_TP, post_TP, 0 }, /* TQ */
-       { pre_PP, NULL, 0 }, /* LP */
+       { pre_abort, NULL, 0 }, /* LP */
        { pre_PP, NULL, 0 }, /* PP */
-       { pre_PP, NULL, 0 }, /* P */
+       { pre_abort, NULL, 0 }, /* P */
        { pre_IP, post_IP, 0 }, /* IP */
        { pre_HP, post_HP, 0 }, /* HP */
        { NULL, NULL, 0 }, /* SM */
@@ -219,6 +220,12 @@ print_bvspace(struct termp *p, const struct roff_node *n, int pardist)
 }
 
 
+static int
+pre_abort(DECL_ARGS)
+{
+       abort();
+}
+
 static int
 pre_ign(DECL_ARGS)
 {
index c0d1a6f..7fa99bc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_validate.c,v 1.108 2018/08/18 02:03:41 schwarze Exp $ */
+/*     $OpenBSD: man_validate.c,v 1.109 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -38,6 +38,7 @@
 
 typedef        void    (*v_check)(CHKARGS);
 
+static void      check_abort(CHKARGS);
 static void      check_par(CHKARGS);
 static void      check_part(CHKARGS);
 static void      check_root(CHKARGS);
@@ -58,9 +59,9 @@ static        const v_check man_valids[MAN_MAX - MAN_TH] = {
        NULL,       /* SS */
        NULL,       /* TP */
        NULL,       /* TQ */
-       check_par,  /* LP */
+       check_abort,/* LP */
        check_par,  /* PP */
-       check_par,  /* P */
+       check_abort,/* P */
        post_IP,    /* IP */
        NULL,       /* HP */
        NULL,       /* SM */
@@ -95,13 +96,33 @@ static      const v_check man_valids[MAN_MAX - MAN_TH] = {
 };
 
 
+/* Validate the subtree rooted at man->last. */
 void
 man_node_validate(struct roff_man *man)
 {
        struct roff_node *n;
        const v_check    *cp;
 
+       /*
+        * Translate obsolete macros such that later code
+        * does not need to look for them.
+        */
+
        n = man->last;
+       switch (n->tok) {
+       case MAN_LP:
+       case MAN_P:
+               n->tok = MAN_PP;
+               break;
+       default:
+               break;
+       }
+
+       /*
+        * Iterate over all children, recursing into each one
+        * in turn, depth-first.
+        */
+
        man->last = man->last->child;
        while (man->last != NULL) {
                man_node_validate(man);
@@ -111,6 +132,8 @@ man_node_validate(struct roff_man *man)
                        man->last = man->last->next;
        }
 
+       /* Finally validate the macro itself. */
+
        man->last = n;
        man->next = ROFF_NEXT_SIBLING;
        switch (n->type) {
@@ -180,6 +203,12 @@ check_root(CHKARGS)
                    "(OpenBSD)" : "(NetBSD)");
 }
 
+static void
+check_abort(CHKARGS)
+{
+       abort();
+}
+
 static void
 check_text(CHKARGS)
 {
@@ -475,8 +504,6 @@ post_vs(CHKARGS)
        case MAN_SH:
        case MAN_SS:
        case MAN_PP:
-       case MAN_LP:
-       case MAN_P:
                mandoc_vmsg(MANDOCERR_PAR_SKIP, man->parse, n->line, n->pos,
                    "%s after %s", roff_name[n->tok],
                    roff_name[n->parent->tok]);
index e8926d1..5e6f7ea 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_html.c,v 1.190 2018/10/04 13:22:35 schwarze Exp $ */
+/*     $OpenBSD: mdoc_html.c,v 1.191 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -60,6 +60,7 @@ static        int               mdoc_root_pre(const struct roff_meta *,
 
 static void              mdoc__x_post(MDOC_ARGS);
 static int               mdoc__x_pre(MDOC_ARGS);
+static int               mdoc_abort_pre(MDOC_ARGS);
 static int               mdoc_ad_pre(MDOC_ARGS);
 static int               mdoc_an_pre(MDOC_ARGS);
 static int               mdoc_ap_pre(MDOC_ARGS);
@@ -152,7 +153,7 @@ static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = {
        {mdoc_nd_pre, NULL}, /* Nd */
        {mdoc_nm_pre, NULL}, /* Nm */
        {mdoc_quote_pre, mdoc_quote_post}, /* Op */
-       {mdoc_ft_pre, NULL}, /* Ot */
+       {mdoc_abort_pre, NULL}, /* Ot */
        {mdoc_pa_pre, NULL}, /* Pa */
        {mdoc_ex_pre, NULL}, /* Rv */
        {mdoc_st_pre, NULL}, /* St */
@@ -225,7 +226,7 @@ static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = {
        {mdoc_em_pre, NULL}, /* Fr */
        {NULL, NULL}, /* Ud */
        {mdoc_lb_pre, NULL}, /* Lb */
-       {mdoc_pp_pre, NULL}, /* Lp */
+       {mdoc_abort_pre, NULL}, /* Lp */
        {mdoc_lk_pre, NULL}, /* Lk */
        {mdoc_mt_pre, NULL}, /* Mt */
        {mdoc_quote_pre, mdoc_quote_post}, /* Brq */
@@ -966,7 +967,6 @@ mdoc_bd_pre(MDOC_ARGS)
                case MDOC_Bl:
                case MDOC_D1:
                case MDOC_Dl:
-               case MDOC_Lp:
                case MDOC_Pp:
                        continue;
                default:
@@ -1806,3 +1806,9 @@ mdoc_eo_post(MDOC_ARGS)
        else if ( ! tail)
                h->flags &= ~HTML_NOSPACE;
 }
+
+static int
+mdoc_abort_pre(MDOC_ARGS)
+{
+       abort();
+}
index 85d3542..0edf3c7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_man.c,v 1.126 2018/08/23 19:32:03 schwarze Exp $ */
+/*     $OpenBSD: mdoc_man.c,v 1.127 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -73,6 +73,7 @@ static        void      post_pf(DECL_ARGS);
 static void      post_sect(DECL_ARGS);
 static void      post_vt(DECL_ARGS);
 static int       pre__t(DECL_ARGS);
+static int       pre_abort(DECL_ARGS);
 static int       pre_an(DECL_ARGS);
 static int       pre_ap(DECL_ARGS);
 static int       pre_aq(DECL_ARGS);
@@ -170,7 +171,7 @@ static const struct mdoc_man_act mdoc_man_acts[MDOC_MAX - MDOC_Dd] = {
        { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */
        { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */
        { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */
-       { NULL, pre_Ft, post_font, NULL, NULL }, /* Ot */
+       { NULL, pre_abort, NULL, NULL, NULL }, /* Ot */
        { NULL, pre_em, post_font, NULL, NULL }, /* Pa */
        { NULL, pre_ex, NULL, NULL, NULL }, /* Rv */
        { NULL, NULL, NULL, NULL, NULL }, /* St */
@@ -243,7 +244,7 @@ static const struct mdoc_man_act mdoc_man_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, pre_em, post_font, NULL, NULL }, /* Fr */
        { NULL, NULL, NULL, NULL, NULL }, /* Ud */
        { NULL, NULL, post_lb, NULL, NULL }, /* Lb */
-       { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */
+       { NULL, pre_abort, NULL, NULL, NULL }, /* Lp */
        { NULL, pre_lk, NULL, NULL, NULL }, /* Lk */
        { NULL, pre_em, post_font, NULL, NULL }, /* Mt */
        { cond_body, pre_enc, post_enc, "{", "}" }, /* Brq */
@@ -722,6 +723,12 @@ cond_body(DECL_ARGS)
        return n->type == ROFFT_BODY;
 }
 
+static int
+pre_abort(DECL_ARGS)
+{
+       abort();
+}
+
 static int
 pre_enc(DECL_ARGS)
 {
index f515031..76f0f0a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_markdown.c,v 1.27 2018/10/25 01:21:30 schwarze Exp $ */
+/*     $OpenBSD: mdoc_markdown.c,v 1.28 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -19,6 +19,7 @@
 #include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "mandoc_aux.h"
@@ -48,6 +49,7 @@ static        void     md_uri(const char *);
 static int      md_cond_head(struct roff_node *);
 static int      md_cond_body(struct roff_node *);
 
+static int      md_pre_abort(struct roff_node *);
 static int      md_pre_raw(struct roff_node *);
 static int      md_pre_word(struct roff_node *);
 static int      md_pre_skip(struct roff_node *);
@@ -138,7 +140,7 @@ static      const struct md_act md_acts[MDOC_MAX - MDOC_Dd] = {
        { md_cond_head, md_pre_Nd, NULL, NULL, NULL }, /* Nd */
        { NULL, md_pre_Nm, md_post_Nm, "**", "**" }, /* Nm */
        { md_cond_body, md_pre_word, md_post_word, "[", "]" }, /* Op */
-       { NULL, md_pre_Fd, md_post_raw, "*", "*" }, /* Ot */
+       { NULL, md_pre_abort, NULL, NULL, NULL }, /* Ot */
        { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Pa */
        { NULL, NULL, NULL, NULL, NULL }, /* Rv */
        { NULL, NULL, NULL, NULL, NULL }, /* St */
@@ -211,7 +213,7 @@ static      const struct md_act md_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Fr */
        { NULL, NULL, NULL, NULL, NULL }, /* Ud */
        { NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */
-       { NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */
+       { NULL, md_pre_abort, NULL, NULL, NULL }, /* Lp */
        { NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */
        { NULL, md_pre_Mt, NULL, NULL, NULL }, /* Mt */
        { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */
@@ -722,6 +724,12 @@ md_cond_body(struct roff_node *n)
        return n->type == ROFFT_BODY;
 }
 
+static int
+md_pre_abort(struct roff_node *n)
+{
+       abort();
+}
+
 static int
 md_pre_raw(struct roff_node *n)
 {
index 8b255bf..4b05466 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_term.c,v 1.267 2018/08/17 20:31:52 schwarze Exp $ */
+/*     $OpenBSD: mdoc_term.c,v 1.268 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -82,6 +82,7 @@ static        void      termp_xx_post(DECL_ARGS);
 
 static int       termp__a_pre(DECL_ARGS);
 static int       termp__t_pre(DECL_ARGS);
+static int       termp_abort_pre(DECL_ARGS);
 static int       termp_an_pre(DECL_ARGS);
 static int       termp_ap_pre(DECL_ARGS);
 static int       termp_bd_pre(DECL_ARGS);
@@ -157,7 +158,7 @@ static const struct mdoc_term_act mdoc_term_acts[MDOC_MAX - MDOC_Dd] = {
        { termp_nd_pre, NULL }, /* Nd */
        { termp_nm_pre, termp_nm_post }, /* Nm */
        { termp_quote_pre, termp_quote_post }, /* Op */
-       { termp_ft_pre, NULL }, /* Ot */
+       { termp_abort_pre, NULL }, /* Ot */
        { termp_under_pre, NULL }, /* Pa */
        { termp_ex_pre, NULL }, /* Rv */
        { NULL, NULL }, /* St */
@@ -230,7 +231,7 @@ static const struct mdoc_term_act mdoc_term_acts[MDOC_MAX - MDOC_Dd] = {
        { termp_under_pre, NULL }, /* Fr */
        { NULL, NULL }, /* Ud */
        { NULL, termp_lb_post }, /* Lb */
-       { termp_pp_pre, NULL }, /* Lp */
+       { termp_abort_pre, NULL }, /* Lp */
        { termp_lk_pre, NULL }, /* Lk */
        { termp_under_pre, NULL }, /* Mt */
        { termp_quote_pre, termp_quote_post }, /* Brq */
@@ -1491,7 +1492,6 @@ termp_bd_pre(DECL_ARGS)
                case MDOC_Bl:
                case MDOC_D1:
                case MDOC_Dl:
-               case MDOC_Lp:
                case MDOC_Pp:
                        continue;
                default:
@@ -2096,3 +2096,9 @@ termp_tag_pre(DECL_ARGS)
                tag_put(n->child->string, 1, p->line);
        return 1;
 }
+
+static int
+termp_abort_pre(DECL_ARGS)
+{
+       abort();
+}
index 4059604..1c80db2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_validate.c,v 1.277 2018/08/17 20:31:52 schwarze Exp $ */
+/*     $OpenBSD: mdoc_validate.c,v 1.278 2018/12/03 21:00:06 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -62,6 +62,7 @@ static        size_t          macro2len(enum roff_tok);
 static void     rewrite_macro2len(struct roff_man *, char **);
 static int      similar(const char *, const char *);
 
+static void     post_abort(POST_ARGS);
 static void     post_an(POST_ARGS);
 static void     post_an_norm(POST_ARGS);
 static void     post_at(POST_ARGS);
@@ -149,7 +150,7 @@ static      const v_post mdoc_valids[MDOC_MAX - MDOC_Dd] = {
        post_nd,        /* Nd */
        post_nm,        /* Nm */
        post_delim_nb,  /* Op */
-       post_obsolete,  /* Ot */
+       post_abort,     /* Ot */
        post_defaults,  /* Pa */
        post_rv,        /* Rv */
        post_st,        /* St */
@@ -222,7 +223,7 @@ static      const v_post mdoc_valids[MDOC_MAX - MDOC_Dd] = {
        post_obsolete,  /* Fr */
        post_eoln,      /* Ud */
        post_lb,        /* Lb */
-       post_par,       /* Lp */
+       post_abort,     /* Lp */
        post_delim_nb,  /* Lk */
        post_defaults,  /* Mt */
        post_delim_nb,  /* Brq */
@@ -283,13 +284,37 @@ static    const char * const secnames[SEC__MAX] = {
 };
 
 
+/* Validate the subtree rooted at mdoc->last. */
 void
 mdoc_node_validate(struct roff_man *mdoc)
 {
        struct roff_node *n, *np;
        const v_post *p;
 
+       /*
+        * Translate obsolete macros to modern macros first
+        * such that later code does not need to look
+        * for the obsolete versions.
+        */
+
        n = mdoc->last;
+       switch (n->tok) {
+       case MDOC_Lp:
+               n->tok = MDOC_Pp;
+               break;
+       case MDOC_Ot:
+               post_obsolete(mdoc);
+               n->tok = MDOC_Ft;
+               break;
+       default:
+               break;
+       }
+
+       /*
+        * Iterate over all children, recursing into each one
+        * in turn, depth-first.
+        */
+
        mdoc->last = mdoc->last->child;
        while (mdoc->last != NULL) {
                mdoc_node_validate(mdoc);
@@ -299,6 +324,8 @@ mdoc_node_validate(struct roff_man *mdoc)
                        mdoc->last = mdoc->last->next;
        }
 
+       /* Finally validate the macro itself. */
+
        mdoc->last = n;
        mdoc->next = ROFF_NEXT_SIBLING;
        switch (n->type) {
@@ -484,6 +511,12 @@ check_toptext(struct roff_man *mdoc, int ln, int pos, const char *p)
        }
 }
 
+static void
+post_abort(POST_ARGS)
+{
+       abort();
+}
+
 static void
 post_delim(POST_ARGS)
 {
@@ -1248,9 +1281,7 @@ post_nm(POST_ARGS)
            n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL)
                mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1);
 
-       if (n->last != NULL &&
-           (n->last->tok == MDOC_Pp ||
-            n->last->tok == MDOC_Lp))
+       if (n->last != NULL && n->last->tok == MDOC_Pp)
                mdoc_node_relink(mdoc, n->last);
 
        if (mdoc->meta.name == NULL)
@@ -1603,7 +1634,6 @@ post_bl_block(POST_ARGS)
                while (nc != NULL) {
                        switch (nc->tok) {
                        case MDOC_Pp:
-                       case MDOC_Lp:
                        case ROFF_br:
                                break;
                        default:
@@ -2477,7 +2507,7 @@ post_ignpar(POST_ARGS)
        }
 
        if ((np = mdoc->last->child) != NULL)
-               if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) {
+               if (np->tok == MDOC_Pp) {
                        mandoc_vmsg(MANDOCERR_PAR_SKIP,
                            mdoc->parse, np->line, np->pos,
                            "%s after %s", roff_name[np->tok],
@@ -2486,7 +2516,7 @@ post_ignpar(POST_ARGS)
                }
 
        if ((np = mdoc->last->last) != NULL)
-               if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) {
+               if (np->tok == MDOC_Pp) {
                        mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
                            np->line, np->pos, "%s at the end of %s",
                            roff_name[np->tok],
@@ -2507,13 +2537,11 @@ post_prevpar(POST_ARGS)
                return;
 
        /*
-        * Don't allow prior `Lp' or `Pp' prior to a paragraph-type
-        * block:  `Lp', `Pp', or non-compact `Bd' or `Bl'.
+        * Don't allow `Pp' prior to a paragraph-type
+        * block: `Pp' or non-compact `Bd' or `Bl'.
         */
 
-       if (n->prev->tok != MDOC_Pp &&
-           n->prev->tok != MDOC_Lp &&
-           n->prev->tok != ROFF_br)
+       if (n->prev->tok != MDOC_Pp && n->prev->tok != ROFF_br)
                return;
        if (n->tok == MDOC_Bl && n->norm->Bl.comp)
                return;
@@ -2551,7 +2579,7 @@ post_par(POST_ARGS)
                np = mdoc->last->parent;
                if (np->tok != MDOC_Sh && np->tok != MDOC_Ss)
                        return;
-       } else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp &&
+       } else if (np->tok != MDOC_Pp &&
            (mdoc->last->tok != ROFF_br ||
             (np->tok != ROFF_sp && np->tok != ROFF_br)))
                return;