diff --git a/src/backend/regex/regc_locale.c b/src/backend/regex/regc_locale.c
index 7cb3a40..3e2d3be 100644
--- a/src/backend/regex/regc_locale.c
+++ b/src/backend/regex/regc_locale.c
@@ -742,7 +742,7 @@ static int						/* 0 for equal, nonzero for unequal */
 cmp(const chr *x, const chr *y, /* strings to compare */
 	size_t len)					/* exact length of comparison */
 {
-	return memcmp(VS(x), VS(y), len * sizeof(chr));
+	return memcmp((const void *)x, (const void *)y, len * sizeof(chr));
 }
 
 /*
diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c
index ed95474..90a134d 100644
--- a/src/backend/regex/regcomp.c
+++ b/src/backend/regex/regcomp.c
@@ -375,7 +375,7 @@ pg_regcomp(regex_t *re,
 	re->re_csize = sizeof(chr);
 	re->re_collation = collation;
 	re->re_guts = NULL;
-	re->re_fns = VS(&functions);
+	re->re_fns = &functions;
 
 	/* more complex setup, malloced things */
 	re->re_guts = VS(MALLOC(sizeof(struct guts)));
diff --git a/src/backend/regex/rege_dfa.c b/src/backend/regex/rege_dfa.c
index b98c9d3..46dd918 100644
--- a/src/backend/regex/rege_dfa.c
+++ b/src/backend/regex/rege_dfa.c
@@ -38,19 +38,19 @@
  * On success, returns match endpoint address.  Returns NULL on no match.
  * Internal errors also return NULL, with v->err set.
  */
-static chr *
+static const chr *
 longest(struct vars * v,
 		struct dfa * d,
-		chr *start,				/* where the match should start */
-		chr *stop,				/* match must end at or before here */
+		const chr *start,		/* where the match should start */
+		const chr *stop,		/* match must end at or before here */
 		int *hitstopp)			/* record whether hit v->stop, if non-NULL */
 {
-	chr		   *cp;
-	chr		   *realstop = (stop == v->stop) ? stop : stop + 1;
+	const chr  *cp;
+	const chr  *realstop = (stop == v->stop) ? stop : stop + 1;
 	color		co;
 	struct sset *css;
 	struct sset *ss;
-	chr		   *post;
+	const chr  *post;
 	int			i;
 	struct colormap *cm = d->cm;
 
@@ -164,18 +164,18 @@ longest(struct vars * v,
  * On success, returns match endpoint address.  Returns NULL on no match.
  * Internal errors also return NULL, with v->err set.
  */
-static chr *
+static const chr *
 shortest(struct vars * v,
 		 struct dfa * d,
-		 chr *start,			/* where the match should start */
-		 chr *min,				/* match must end at or after here */
-		 chr *max,				/* match must end at or before here */
-		 chr **coldp,			/* store coldstart pointer here, if non-NULL */
+		 const chr *start,		/* where the match should start */
+		 const chr *min,		/* match must end at or after here */
+		 const chr *max,		/* match must end at or before here */
+		 const chr **coldp,		/* store coldstart pointer here, if non-NULL */
 		 int *hitstopp)			/* record whether hit v->stop, if non-NULL */
 {
-	chr		   *cp;
-	chr		   *realmin = (min == v->stop) ? min : min + 1;
-	chr		   *realmax = (max == v->stop) ? max : max + 1;
+	const chr  *cp;
+	const chr  *realmin = (min == v->stop) ? min : min + 1;
+	const chr  *realmax = (max == v->stop) ? max : max + 1;
 	color		co;
 	struct sset *css;
 	struct sset *ss;
@@ -302,11 +302,11 @@ shortest(struct vars * v,
 static int
 matchuntil(struct vars * v,
 		   struct dfa * d,
-		   chr *probe,			/* we want to know if a match ends here */
-		   struct sset ** lastcss,		/* state storage across calls */
-		   chr **lastcp)		/* state storage across calls */
+		   const chr *probe,		/* we want to know if a match ends here */
+		   struct sset ** lastcss,	/* state storage across calls */
+		   const chr **lastcp)		/* state storage across calls */
 {
-	chr		   *cp = *lastcp;
+	const chr  *cp = *lastcp;
 	color		co;
 	struct sset *css = *lastcss;
 	struct sset *ss;
@@ -413,12 +413,12 @@ matchuntil(struct vars * v,
 /*
  * lastcold - determine last point at which no progress had been made
  */
-static chr *					/* endpoint, or NULL */
+static const chr *					/* endpoint, or NULL */
 lastcold(struct vars * v,
 		 struct dfa * d)
 {
 	struct sset *ss;
-	chr		   *nopr;
+	const chr   *nopr;
 	int			i;
 
 	nopr = d->lastnopr;
@@ -556,7 +556,7 @@ hash(unsigned *uv,
 static struct sset *
 initialize(struct vars * v,
 		   struct dfa * d,
-		   chr *start)
+		   const chr *start)
 {
 	struct sset *ss;
 	int			i;
@@ -604,8 +604,8 @@ miss(struct vars * v,
 	 struct dfa * d,
 	 struct sset * css,
 	 color co,
-	 chr *cp,					/* next chr */
-	 chr *start)				/* where the attempt got started */
+	 const chr *cp,					/* next chr */
+	 const chr *start)				/* where the attempt got started */
 {
 	struct cnfa *cnfa = d->cnfa;
 	int			i;
@@ -742,13 +742,13 @@ miss(struct vars * v,
 static int						/* predicate:  constraint satisfied? */
 lacon(struct vars * v,
 	  struct cnfa * pcnfa,		/* parent cnfa */
-	  chr *cp,
+	  const chr *cp,
 	  color co)					/* "color" of the lookaround constraint */
 {
 	int			n;
 	struct subre *sub;
 	struct dfa *d;
-	chr		   *end;
+	const chr  *end;
 	int			satisfied;
 
 	/* Since this is recursive, it could be driven to stack overflow */
@@ -769,7 +769,7 @@ lacon(struct vars * v,
 	{
 		/* used to use longest() here, but shortest() could be much cheaper */
 		end = shortest(v, d, cp, cp, v->stop,
-					   (chr **) NULL, (int *) NULL);
+					   (const chr **) NULL, (int *) NULL);
 		satisfied = LATYPE_IS_POS(sub->subno) ? (end != NULL) : (end == NULL);
 	}
 	else
@@ -799,8 +799,8 @@ lacon(struct vars * v,
 static struct sset *
 getvacant(struct vars * v,
 		  struct dfa * d,
-		  chr *cp,
-		  chr *start)
+		  const chr *cp,
+		  const chr *start)
 {
 	int			i;
 	struct sset *ss;
@@ -870,13 +870,13 @@ getvacant(struct vars * v,
 static struct sset *
 pickss(struct vars * v,
 	   struct dfa * d,
-	   chr *cp,
-	   chr *start)
+	   const chr *cp,
+	   const chr *start)
 {
 	int			i;
 	struct sset *ss;
 	struct sset *end;
-	chr		   *ancient;
+	const chr   *ancient;
 
 	/* shortcut for cases where cache isn't full */
 	if (d->nssused < d->nssets)
diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c
index 5cbfd9b..700be35 100644
--- a/src/backend/regex/regexec.c
+++ b/src/backend/regex/regexec.c
@@ -55,7 +55,7 @@ struct sset
 #define  LOCKED		 04			/* locked in cache */
 #define  NOPROGRESS  010		/* zero-progress state set */
 	struct arcp ins;			/* chain of inarcs pointing here */
-	chr		   *lastseen;		/* last entered on arrival here */
+	const chr   *lastseen;		/* last entered on arrival here */
 	struct sset **outs;			/* outarc vector indexed by color */
 	struct arcp *inchain;		/* chain-pointer vector for outarcs */
 };
@@ -74,8 +74,8 @@ struct dfa
 	struct arcp *incarea;		/* inchain storage */
 	struct cnfa *cnfa;
 	struct colormap *cm;
-	chr		   *lastpost;		/* location of last cache-flushed success */
-	chr		   *lastnopr;		/* location of last cache-flushed NOPROGRESS */
+	const chr   *lastpost;		/* location of last cache-flushed success */
+	const chr   *lastnopr;		/* location of last cache-flushed NOPROGRESS */
 	struct sset *search;		/* replacement-search-pointer memory */
 	int			cptsmalloced;	/* were the areas individually malloced? */
 	char	   *mallocarea;		/* self, or master malloced area, or NULL */
@@ -108,14 +108,14 @@ struct vars
 	size_t		nmatch;
 	regmatch_t *pmatch;
 	rm_detail_t *details;
-	chr		   *start;			/* start of string */
-	chr		   *search_start;	/* search start of string */
-	chr		   *stop;			/* just past end of string */
+	const chr   *start;			/* start of string */
+	const chr   *search_start;	/* search start of string */
+	const chr   *stop;			/* just past end of string */
 	int			err;			/* error code if any (0 none) */
 	struct dfa **subdfas;		/* per-tree-subre DFAs */
 	struct dfa **ladfas;		/* per-lacon-subre DFAs */
 	struct sset **lblastcss;	/* per-lacon-subre lookbehind restart data */
-	chr		  **lblastcp;		/* per-lacon-subre lookbehind restart data */
+	const chr  **lblastcp;		/* per-lacon-subre lookbehind restart data */
 	struct smalldfa dfa1;
 	struct smalldfa dfa2;
 };
@@ -138,31 +138,31 @@ static struct dfa *getsubdfa(struct vars *, struct subre *);
 static struct dfa *getladfa(struct vars *, int);
 static int	find(struct vars *, struct cnfa *, struct colormap *);
 static int	cfind(struct vars *, struct cnfa *, struct colormap *);
-static int	cfindloop(struct vars *, struct cnfa *, struct colormap *, struct dfa *, struct dfa *, chr **);
+static int	cfindloop(struct vars *, struct cnfa *, struct colormap *, struct dfa *, struct dfa *, const chr **);
 static void zapallsubs(regmatch_t *, size_t);
 static void zaptreesubs(struct vars *, struct subre *);
-static void subset(struct vars *, struct subre *, chr *, chr *);
-static int	cdissect(struct vars *, struct subre *, chr *, chr *);
-static int	ccondissect(struct vars *, struct subre *, chr *, chr *);
-static int	crevcondissect(struct vars *, struct subre *, chr *, chr *);
-static int	cbrdissect(struct vars *, struct subre *, chr *, chr *);
-static int	caltdissect(struct vars *, struct subre *, chr *, chr *);
-static int	citerdissect(struct vars *, struct subre *, chr *, chr *);
-static int	creviterdissect(struct vars *, struct subre *, chr *, chr *);
+static void subset(struct vars *, struct subre *, const chr *, const chr *);
+static int	cdissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	ccondissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	crevcondissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	cbrdissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	caltdissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	citerdissect(struct vars *, struct subre *, const chr *, const chr *);
+static int	creviterdissect(struct vars *, struct subre *, const chr *, const chr *);
 
 /* === rege_dfa.c === */
-static chr *longest(struct vars *, struct dfa *, chr *, chr *, int *);
-static chr *shortest(struct vars *, struct dfa *, chr *, chr *, chr *, chr **, int *);
-static int	matchuntil(struct vars *, struct dfa *, chr *, struct sset **, chr **);
-static chr *lastcold(struct vars *, struct dfa *);
+static const chr *longest(struct vars *, struct dfa *, const chr *, const chr *, int *);
+static const chr *shortest(struct vars *, struct dfa *, const chr *, const chr *, const chr *, const chr **, int *);
+static int	matchuntil(struct vars *, struct dfa *, const chr *, struct sset **, const chr **);
+static const chr *lastcold(struct vars *, struct dfa *);
 static struct dfa *newdfa(struct vars *, struct cnfa *, struct colormap *, struct smalldfa *);
 static void freedfa(struct dfa *);
 static unsigned hash(unsigned *, int);
-static struct sset *initialize(struct vars *, struct dfa *, chr *);
-static struct sset *miss(struct vars *, struct dfa *, struct sset *, color, chr *, chr *);
-static int	lacon(struct vars *, struct cnfa *, chr *, color);
-static struct sset *getvacant(struct vars *, struct dfa *, chr *, chr *);
-static struct sset *pickss(struct vars *, struct dfa *, chr *, chr *);
+static struct sset *initialize(struct vars *, struct dfa *, const chr *);
+static struct sset *miss(struct vars *, struct dfa *, struct sset *, color, const chr *, const chr *);
+static int	lacon(struct vars *, struct cnfa *, const chr *, color);
+static struct sset *getvacant(struct vars *, struct dfa *, const chr *, const chr *);
+static struct sset *pickss(struct vars *, struct dfa *, const chr *, const chr *);
 
 
 /*
@@ -227,9 +227,9 @@ pg_regexec(regex_t *re,
 	else
 		v->pmatch = pmatch;
 	v->details = details;
-	v->start = (chr *) string;
-	v->search_start = (chr *) string + search_start;
-	v->stop = (chr *) string + len;
+	v->start = (const chr *) string;
+	v->search_start = (const chr *) string + search_start;
+	v->stop = (const chr *) string + len;
 	v->err = 0;
 	v->subdfas = NULL;
 	v->ladfas = NULL;
@@ -266,7 +266,7 @@ pg_regexec(regex_t *re,
 		for (i = 0; i < n; i++)
 			v->ladfas[i] = NULL;
 		v->lblastcss = (struct sset **) MALLOC(n * sizeof(struct sset *));
-		v->lblastcp = (chr **) MALLOC(n * sizeof(chr *));
+		v->lblastcp = (const chr **) MALLOC(n * sizeof(const chr *));
 		if (v->lblastcss == NULL || v->lblastcp == NULL)
 		{
 			st = REG_ESPACE;
@@ -378,11 +378,11 @@ find(struct vars * v,
 {
 	struct dfa *s;
 	struct dfa *d;
-	chr		   *begin;
-	chr		   *end = NULL;
-	chr		   *cold;
-	chr		   *open;			/* open and close of range of possible starts */
-	chr		   *close;
+	const chr  *begin;
+	const chr  *end = NULL;
+	const chr  *cold;
+	const chr  *open;			/* open and close of range of possible starts */
+	const chr  *close;
 	int			hitend;
 	int			shorter = (v->g->tree->flags & SHORTER) ? 1 : 0;
 
@@ -423,7 +423,7 @@ find(struct vars * v,
 		MDEBUG(("\nfind trying at %ld\n", LOFF(begin)));
 		if (shorter)
 			end = shortest(v, d, begin, begin, v->stop,
-						   (chr **) NULL, &hitend);
+						   (const chr **) NULL, &hitend);
 		else
 			end = longest(v, d, begin, v->stop, &hitend);
 		if (ISERR())
@@ -469,7 +469,7 @@ cfind(struct vars * v,
 {
 	struct dfa *s;
 	struct dfa *d;
-	chr		   *cold;
+	const chr  *cold;
 	int			ret;
 
 	s = newdfa(v, &v->g->search, cm, &v->dfa1);
@@ -508,15 +508,15 @@ cfindloop(struct vars * v,
 		  struct colormap * cm,
 		  struct dfa * d,
 		  struct dfa * s,
-		  chr **coldp)			/* where to put coldstart pointer */
+		  const chr **coldp)	/* where to put coldstart pointer */
 {
-	chr		   *begin;
-	chr		   *end;
-	chr		   *cold;
-	chr		   *open;			/* open and close of range of possible starts */
-	chr		   *close;
-	chr		   *estart;
-	chr		   *estop;
+	const chr  *begin;
+	const chr  *end;
+	const chr  *cold;
+	const chr  *open;			/* open and close of range of possible starts */
+	const chr  *close;
+	const chr  *estart;
+	const chr  *estop;
 	int			er;
 	int			shorter = v->g->tree->flags & SHORTER;
 	int			hitend;
@@ -551,7 +551,7 @@ cfindloop(struct vars * v,
 				/* Here we use the top node's detailed RE */
 				if (shorter)
 					end = shortest(v, d, begin, estart,
-								   estop, (chr **) NULL, &hitend);
+								   estop, (const chr **) NULL, &hitend);
 				else
 					end = longest(v, d, begin, estop,
 								  &hitend);
@@ -659,8 +659,8 @@ zaptreesubs(struct vars * v,
 static void
 subset(struct vars * v,
 	   struct subre * sub,
-	   chr *begin,
-	   chr *end)
+	   const chr *begin,
+	   const chr *end)
 {
 	int			n = sub->subno;
 
@@ -691,8 +691,8 @@ subset(struct vars * v,
 static int						/* regexec return code */
 cdissect(struct vars * v,
 		 struct subre * t,
-		 chr *begin,			/* beginning of relevant substring */
-		 chr *end)				/* end of same */
+		 const chr *begin,		/* beginning of relevant substring */
+		 const chr *end)		/* end of same */
 {
 	int			er;
 
@@ -762,12 +762,12 @@ cdissect(struct vars * v,
 static int						/* regexec return code */
 ccondissect(struct vars * v,
 			struct subre * t,
-			chr *begin,			/* beginning of relevant substring */
-			chr *end)			/* end of same */
+			const chr *begin,	/* beginning of relevant substring */
+			const chr *end)		/* end of same */
 {
 	struct dfa *d;
 	struct dfa *d2;
-	chr		   *mid;
+	const chr  *mid;
 	int			er;
 
 	assert(t->op == '.');
@@ -840,12 +840,12 @@ ccondissect(struct vars * v,
 static int						/* regexec return code */
 crevcondissect(struct vars * v,
 			   struct subre * t,
-			   chr *begin,		/* beginning of relevant substring */
-			   chr *end)		/* end of same */
+			   const chr *begin,	/* beginning of relevant substring */
+			   const chr *end)		/* end of same */
 {
 	struct dfa *d;
 	struct dfa *d2;
-	chr		   *mid;
+	const chr  *mid;
 	int			er;
 
 	assert(t->op == '.');
@@ -860,7 +860,7 @@ crevcondissect(struct vars * v,
 	MDEBUG(("crevcon %d\n", t->id));
 
 	/* pick a tentative midpoint */
-	mid = shortest(v, d, begin, begin, end, (chr **) NULL, (int *) NULL);
+	mid = shortest(v, d, begin, begin, end, (const chr **) NULL, (int *) NULL);
 	NOERR();
 	if (mid == NULL)
 		return REG_NOMATCH;
@@ -895,7 +895,7 @@ crevcondissect(struct vars * v,
 			MDEBUG(("%d no midpoint\n", t->id));
 			return REG_NOMATCH;
 		}
-		mid = shortest(v, d, begin, mid + 1, end, (chr **) NULL, (int *) NULL);
+		mid = shortest(v, d, begin, mid + 1, end, (const chr **) NULL, (int *) NULL);
 		NOERR();
 		if (mid == NULL)
 		{
@@ -918,15 +918,15 @@ crevcondissect(struct vars * v,
 static int						/* regexec return code */
 cbrdissect(struct vars * v,
 		   struct subre * t,
-		   chr *begin,			/* beginning of relevant substring */
-		   chr *end)			/* end of same */
+		   const chr *begin,	/* beginning of relevant substring */
+		   const chr *end)		/* end of same */
 {
 	int			n = t->subno;
 	size_t		numreps;
 	size_t		tlen;
 	size_t		brlen;
-	chr		   *brstring;
-	chr		   *p;
+	const chr  *brstring;
+	const chr  *p;
 	int			min = t->min;
 	int			max = t->max;
 
@@ -999,8 +999,8 @@ cbrdissect(struct vars * v,
 static int						/* regexec return code */
 caltdissect(struct vars * v,
 			struct subre * t,
-			chr *begin,			/* beginning of relevant substring */
-			chr *end)			/* end of same */
+			const chr *begin,	/* beginning of relevant substring */
+			const chr *end)		/* end of same */
 {
 	struct dfa *d;
 	int			er;
@@ -1036,12 +1036,12 @@ caltdissect(struct vars * v,
 static int						/* regexec return code */
 citerdissect(struct vars * v,
 			 struct subre * t,
-			 chr *begin,		/* beginning of relevant substring */
-			 chr *end)			/* end of same */
+			 const chr *begin,	/* beginning of relevant substring */
+			 const chr *end)	/* end of same */
 {
 	struct dfa *d;
-	chr		  **endpts;
-	chr		   *limit;
+	const chr  **endpts;
+	const chr  *limit;
 	int			min_matches;
 	size_t		max_matches;
 	int			nverified;
@@ -1081,7 +1081,7 @@ citerdissect(struct vars * v,
 		max_matches = t->max;
 	if (max_matches < min_matches)
 		max_matches = min_matches;
-	endpts = (chr **) MALLOC((max_matches + 1) * sizeof(chr *));
+	endpts = (const chr **) MALLOC((max_matches + 1) * sizeof(const chr *));
 	if (endpts == NULL)
 		return REG_ESPACE;
 	endpts[0] = begin;
@@ -1197,7 +1197,7 @@ backtrack:
 		 */
 		while (k > 0)
 		{
-			chr		   *prev_end = endpts[k - 1];
+			const chr	   *prev_end = endpts[k - 1];
 
 			if (endpts[k] > prev_end)
 			{
@@ -1237,12 +1237,12 @@ backtrack:
 static int						/* regexec return code */
 creviterdissect(struct vars * v,
 				struct subre * t,
-				chr *begin,		/* beginning of relevant substring */
-				chr *end)		/* end of same */
+				const chr *begin,	/* beginning of relevant substring */
+				const chr *end)		/* end of same */
 {
 	struct dfa *d;
-	chr		  **endpts;
-	chr		   *limit;
+	const chr  **endpts;
+	const chr  *limit;
 	int			min_matches;
 	size_t		max_matches;
 	int			nverified;
@@ -1282,7 +1282,7 @@ creviterdissect(struct vars * v,
 		max_matches = t->max;
 	if (max_matches < min_matches)
 		max_matches = min_matches;
-	endpts = (chr **) MALLOC((max_matches + 1) * sizeof(chr *));
+	endpts = (const chr **) MALLOC((max_matches + 1) * sizeof(const chr *));
 	if (endpts == NULL)
 		return REG_ESPACE;
 	endpts[0] = begin;
@@ -1325,7 +1325,7 @@ creviterdissect(struct vars * v,
 
 		/* try to find an endpoint for the k'th sub-match */
 		endpts[k] = shortest(v, d, endpts[k - 1], limit, end,
-							 (chr **) NULL, (int *) NULL);
+							 (const chr **) NULL, (int *) NULL);
 		if (ISERR())
 		{
 			FREE(endpts);
diff --git a/src/backend/regex/regfree.c b/src/backend/regex/regfree.c
index ae17ae7..2aac3db 100644
--- a/src/backend/regex/regfree.c
+++ b/src/backend/regex/regfree.c
@@ -50,5 +50,5 @@ pg_regfree(regex_t *re)
 {
 	if (re == NULL)
 		return;
-	(*((struct fns *) re->re_fns)->free) (re);
+	(*((const struct fns *) re->re_fns)->free) (re);
 }
diff --git a/src/include/regex/regcustom.h b/src/include/regex/regcustom.h
index 04a1893..b97bce2 100644
--- a/src/include/regex/regcustom.h
+++ b/src/include/regex/regcustom.h
@@ -28,6 +28,18 @@
  * src/include/regex/regcustom.h
  */
 
+/*
+ * Modification Notice:
+ *
+ * I have modified the software in this regex package, including files in the
+ * src/include/regex and src/backend/regex directories, to avoid casting away
+ * const and enable compiling the software with the -Wcast-qual flag without
+ * warning.  This notice is given to comply with the license requirement, above,
+ * which requires me to indicate the origin and nature of modifications.
+ *
+ *		Mark Dilger, September 26, 2016
+ */
+
 /* headers if any */
 #include "postgres.h"
 
diff --git a/src/include/regex/regex.h b/src/include/regex/regex.h
index cc73db2..fed55ce 100644
--- a/src/include/regex/regex.h
+++ b/src/include/regex/regex.h
@@ -47,6 +47,8 @@
  */
 typedef long regoff_t;
 
+struct fns;
+
 /*
  * other interface types
  */
@@ -76,7 +78,7 @@ typedef struct
 	Oid			re_collation;	/* Collation that defines LC_CTYPE behavior */
 	/* the rest is opaque pointers to hidden innards */
 	char	   *re_guts;		/* `char *' is more portable than `void *' */
-	char	   *re_fns;
+	const struct fns   *re_fns;
 } regex_t;
 
 /* result reporting (may acquire more fields later) */
diff --git a/src/include/regex/regguts.h b/src/include/regex/regguts.h
index 69816f1..86eb6e0 100644
--- a/src/include/regex/regguts.h
+++ b/src/include/regex/regguts.h
@@ -450,10 +450,10 @@ struct fns
 };
 
 #define CANCEL_REQUESTED(re)  \
-	((*((struct fns *) (re)->re_fns)->cancel_requested) ())
+	((*((const struct fns *) (re)->re_fns)->cancel_requested) ())
 
 #define STACK_TOO_DEEP(re)	\
-	((*((struct fns *) (re)->re_fns)->stack_too_deep) ())
+	((*((const struct fns *) (re)->re_fns)->stack_too_deep) ())
 
 
 /*
