Skip to content

Commit 1f664ef

Browse files
committed
Add support for VS2015 (VC++ 14.0)
Due to the rewritten CRT in this version of Visual C++ it is no longer possible (or at least not at all easy) to make use of the ioinfo struct, which commit b47a847 (re-)introduced in order to fix RT#120091/118059. Therefore, we effectively revert commit b47a847 for VS2015 onwards on the basis that being able to build with VS2015 onwards is more important than the RT#120091/118059 bug fix. This does unfortunately mean that perls built with <=VS2013 will not be compatible with perls built with >=VS2015, but they may well not have been compatible anyway because of the CRT rewrite, and certainly wouldn't be compatible if perl builds with VS2015 were not supported! See RT#125714 for more discussion about this.
1 parent b3dc9cf commit 1f664ef

File tree

10 files changed

+251
-30
lines changed

10 files changed

+251
-30
lines changed

README.win32

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ that are also supported by perl's makefile.
6363
=back
6464

6565
The Microsoft Visual C++ compilers are also now being given away free. They are
66-
available as "Visual C++ Toolkit 2003" or "Visual C++ 2005-2013 Express
66+
available as "Visual C++ Toolkit 2003" or "Visual C++ 2005-2015 Express
6767
Edition" (and also as part of the ".NET Framework SDK") and are the same
6868
compilers that ship with "Visual C++ .NET 2003 Professional" or "Visual C++
69-
2005-2013 Professional" respectively.
69+
2005-2015 Professional" respectively.
7070

7171
This port can also be built on IA64/AMD64 using:
7272

@@ -139,9 +139,9 @@ console already set up for your target architecture (x86-32 or x86-64 or IA64).
139139
With the newer compilers, you may also use the older batch files if you choose
140140
so.
141141

142-
=item Microsoft Visual C++ 2008-2013 Express Edition
142+
=item Microsoft Visual C++ 2008-2015 Express Edition
143143

144-
These free versions of Visual C++ 2008-2013 Professional contain the same
144+
These free versions of Visual C++ 2008-2015 Professional contain the same
145145
compilers and linkers that ship with the full versions, and also contain
146146
everything necessary to build Perl, rather than requiring a separate download
147147
of the Windows SDK like previous versions did.
@@ -151,14 +151,14 @@ L<http://www.microsoft.com/downloads/search.aspx?displaylang=en>. (Providing ex
151151
links to these packages has proven a pointless task because the links keep on
152152
changing so often.)
153153

154-
Install Visual C++ 2008-2013 Express, then setup your environment using, e.g.
154+
Install Visual C++ 2008-2015 Express, then setup your environment using, e.g.
155155

156156
C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat
157157

158158
(assuming the default installation location was chosen).
159159

160160
Perl should now build using the win32/Makefile. You will need to edit that
161-
file to set CCTYPE to one of MSVC90FREE-MSVC120FREE first.
161+
file to set CCTYPE to one of MSVC90FREE-MSVC140FREE first.
162162

163163
=item Microsoft Visual C++ 2005 Express Edition
164164

@@ -421,8 +421,8 @@ There should be no test failures.
421421
If you build with Visual C++ 2013 then three tests currently may fail with
422422
Daylight Saving Time related problems: F<t/io/fs.t>,
423423
F<cpan/HTTP-Tiny/t/110_mirror.t> and F<lib/File/Copy.t>. The failures are
424-
caused by bugs in the CRT in VC++ 2013 which will be fixed in future releases
425-
of VC++, as explained by Microsoft here:
424+
caused by bugs in the CRT in VC++ 2013 which are fixed in VC++2015 and
425+
later, as explained by Microsoft here:
426426
L<https://connect.microsoft.com/VisualStudio/feedback/details/811534/utime-sometimes-fails-to-set-the-correct-file-times-in-visual-c-2013>. In the meantime,
427427
if you need fixed C<stat> and C<utime> functions then have a look at the
428428
CPAN distribution Win32::UTCFileTime.
@@ -950,6 +950,6 @@ Win9x support was added in 5.6 (Benjamin Stuhl).
950950

951951
Support for 64-bit Windows added in 5.8 (ActiveState Corp).
952952

953-
Last updated: 07 October 2014
953+
Last updated: 19 February 2017
954954

955955
=cut

perlio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3231,7 +3231,7 @@ PerlIOStdio_invalidate_fileno(pTHX_ FILE *f)
32313231
structure at all
32323232
*/
32333233
# else
3234-
f->_file = -1;
3234+
PERLIO_FILE_file(f) = -1;
32353235
# endif
32363236
return 1;
32373237
# else

win32/GNUmakefile

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ USE_LARGE_FILES := define
173173
#CCTYPE := MSVC120
174174
# Visual C++ 2013 Express Edition (aka Visual C++ 12.0) (free version)
175175
#CCTYPE := MSVC120FREE
176+
# Visual C++ 2015 (aka Visual C++ 14.0) (full version)
177+
#CCTYPE := MSVC140
178+
# Visual C++ 2015 Express Edition (aka Visual C++ 14.0) (free version)
179+
#CCTYPE := MSVC140FREE
176180
# MinGW or mingw-w64 with gcc-3.4.5 or later
177181
#CCTYPE := GCC
178182

@@ -619,7 +623,13 @@ DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
619623
LOCDEFS = -DPERLDLL -DPERL_CORE
620624
CXX_FLAG = -TP -EHsc
621625

626+
ifeq ($(CCTYPE),MSVC140)
627+
LIBC = ucrt.lib
628+
else ifeq ($(CCTYPE),MSVC140FREE)
629+
LIBC = ucrt.lib
630+
else
622631
LIBC = msvcrt.lib
632+
endif
623633

624634
ifeq ($(CFG),Debug)
625635
OPTIMIZE = -Od -MD -Zi -DDEBUGGING
@@ -628,7 +638,13 @@ else ifeq ($(CFG),DebugSymbols)
628638
OPTIMIZE = -Od -MD -Zi
629639
LINK_DBG = -debug
630640
else ifeq ($(CFG),DebugFull)
641+
ifeq ($(CCTYPE),MSVC140)
642+
LIBC = ucrtd.lib
643+
else ifeq ($(CCTYPE),MSVC140FREE)
644+
LIBC = ucrtd.lib
645+
else
631646
LIBC = msvcrtd.lib
647+
endif
632648
OPTIMIZE = -Od -MDd -Zi -D_DEBUG -DDEBUGGING
633649
LINK_DBG = -debug
634650
else
@@ -661,6 +677,13 @@ ifeq ($(PREMSVC80),undef)
661677
DEFINES += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
662678
endif
663679

680+
# Likewise for deprecated Winsock APIs in VC++ 14.0 for now.
681+
ifeq ($(CCTYPE),MSVC140)
682+
DEFINES = $(DEFINES) -D_WINSOCK_DEPRECATED_NO_WARNINGS
683+
else ifeq ($(CCTYPE),MSVC140FREE)
684+
DEFINES = $(DEFINES) -D_WINSOCK_DEPRECATED_NO_WARNINGS
685+
endif
686+
664687
# In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to
665688
# 64-bit, even in 32-bit mode. It also provides the _USE_32BIT_TIME_T
666689
# preprocessor option to revert back to the old functionality for
@@ -680,6 +703,20 @@ LIBBASEFILES = oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
680703
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib \
681704
odbc32.lib odbccp32.lib comctl32.lib
682705

706+
ifeq ($(CCTYPE),MSVC140)
707+
ifeq ($(CFG),DebugFull)
708+
LIBBASEFILES += msvcrtd.lib vcruntimed.lib
709+
else
710+
LIBBASEFILES += msvcrt.lib vcruntime.lib
711+
endif
712+
else ifeq ($(CCTYPE),MSVC140FREE)
713+
ifeq ($(CFG),DebugFull)
714+
LIBBASEFILES += msvcrtd.lib vcruntimed.lib
715+
else
716+
LIBBASEFILES += msvcrt.lib vcruntime.lib
717+
endif
718+
endif
719+
683720
# Avoid __intel_new_proc_init link error for libircmt.
684721
# libmmd is /MD equivelent, other variants exist.
685722
# libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
@@ -1240,6 +1277,27 @@ $(MINIDIR)\.exists : $(CFGH_TMPL)
12401277
echo #undef NVff&& \
12411278
echo #undef NVgf&& \
12421279
echo #undef USE_LONG_DOUBLE)>> config.h
1280+
ifeq ($(CCTYPE),MSVC140)
1281+
@(echo #undef FILE_ptr&& \
1282+
echo #undef FILE_cnt&& \
1283+
echo #undef FILE_base&& \
1284+
echo #undef FILE_bufsiz&& \
1285+
echo #define FILE_ptr(fp) PERLIO_FILE_ptr(fp)&& \
1286+
echo #define FILE_cnt(fp) PERLIO_FILE_cnt(fp)&& \
1287+
echo #define FILE_base(fp) PERLIO_FILE_base(fp)&& \
1288+
echo #define FILE_bufsiz(fp) (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))&& \
1289+
echo #define I_STDBOOL)>> config.h
1290+
else ifeq ($(CCTYPE),MSVC140FREE)
1291+
@(echo #undef FILE_ptr&& \
1292+
echo #undef FILE_cnt&& \
1293+
echo #undef FILE_base&& \
1294+
echo #undef FILE_bufsiz&& \
1295+
echo #define FILE_ptr(fp) PERLIO_FILE_ptr(fp)&& \
1296+
echo #define FILE_cnt(fp) PERLIO_FILE_cnt(fp)&& \
1297+
echo #define FILE_base(fp) PERLIO_FILE_base(fp)&& \
1298+
echo #define FILE_bufsiz(fp) (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))&& \
1299+
echo #define I_STDBOOL)>> config.h
1300+
endif
12431301
ifeq ($(USE_LARGE_FILES),define)
12441302
@(echo #define Off_t $(INT64)&& \
12451303
echo #define LSEEKSIZE ^8&& \

win32/Makefile

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ CCTYPE = MSVC60
133133
#CCTYPE = MSVC120
134134
# Visual C++ 2013 Express Edition (aka Visual C++ 12.0) (free version)
135135
#CCTYPE = MSVC120FREE
136+
# Visual C++ 2015 (aka Visual C++ 14.0) (full version)
137+
#CCTYPE = MSVC140
138+
# Visual C++ 2015 Express Edition (aka Visual C++ 14.0) (free version)
139+
#CCTYPE = MSVC140FREE
136140

137141
#
138142
# If you are using Intel C++ Compiler uncomment this
@@ -467,7 +471,11 @@ DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
467471
LOCDEFS = -DPERLDLL -DPERL_CORE
468472
CXX_FLAG = -TP -EHsc
469473

474+
!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
475+
LIBC = ucrt.lib
476+
!ELSE
470477
LIBC = msvcrt.lib
478+
!ENDIF
471479

472480
!IF "$(CFG)" == "Debug"
473481
OPTIMIZE = -Od -MD -Zi -DDEBUGGING
@@ -478,7 +486,11 @@ OPTIMIZE = -Od -MD -Zi
478486
LINK_DBG = -debug
479487
!ELSE
480488
!IF "$(CFG)" == "DebugFull"
489+
!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
490+
LIBC = ucrtd.lib
491+
!ELSE
481492
LIBC = msvcrtd.lib
493+
!ENDIF
482494
OPTIMIZE = -Od -MDd -Zi -D_DEBUG -DDEBUGGING
483495
LINK_DBG = -debug
484496
!ELSE
@@ -513,6 +525,11 @@ OPTIMIZE = $(OPTIMIZE) -fp:precise
513525
DEFINES = $(DEFINES) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
514526
!ENDIF
515527

528+
# Likewise for deprecated Winsock APIs in VC++ 14.0 for now.
529+
!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
530+
DEFINES = $(DEFINES) -D_WINSOCK_DEPRECATED_NO_WARNINGS
531+
!ENDIF
532+
516533
# In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to
517534
# 64-bit, even in 32-bit mode. It also provides the _USE_32BIT_TIME_T
518535
# preprocessor option to revert back to the old functionality for
@@ -533,6 +550,14 @@ LIBBASEFILES = \
533550
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
534551
version.lib odbc32.lib odbccp32.lib comctl32.lib
535552

553+
!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
554+
! IF "$(CFG)" == "DebugFull"
555+
LIBBASEFILES = $(LIBBASEFILES) msvcrtd.lib vcruntimed.lib
556+
! ELSE
557+
LIBBASEFILES = $(LIBBASEFILES) msvcrt.lib vcruntime.lib
558+
! ENDIF
559+
!ENDIF
560+
536561
# Avoid __intel_new_proc_init link error for libircmt.
537562
# libmmd is /MD equivelent, other variants exist.
538563
# libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
@@ -928,6 +953,17 @@ perlglob$(o) : perlglob.c
928953
@echo.>>$@
929954
@echo #ifndef _config_h_footer_>>$@
930955
@echo #define _config_h_footer_>>$@
956+
!IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
957+
@echo #undef FILE_ptr>>$@
958+
@echo #define FILE_ptr(fp) PERLIO_FILE_ptr(fp)>>$@
959+
@echo #undef FILE_cnt>>$@
960+
@echo #define FILE_cnt(fp) PERLIO_FILE_cnt(fp)>>$@
961+
@echo #undef FILE_base>>$@
962+
@echo #define FILE_base(fp) PERLIO_FILE_base(fp)>>$@
963+
@echo #undef FILE_bufsiz>>$@
964+
@echo #define FILE_bufsiz(fp) (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))>>$@
965+
@echo #define I_STDBOOL>>$@
966+
!ENDIF
931967
@echo #undef Off_t>>$@
932968
@echo #undef LSEEKSIZE>>$@
933969
@echo #undef Off_t_size>>$@

win32/config_sh.PL

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,13 @@ if ($opt{cc} =~ /\bcl/ and $opt{ccversion} =~ /^(\d+)/) {
277277
if($ccversion < 13) { #VC6
278278
$opt{ar} ='lib';
279279
}
280+
if ($ccversion >= 19) { # VC14
281+
$opt{stdio_base} = 'PERLIO_FILE_base(fp)';
282+
$opt{stdio_bufsiz} = '(PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))';
283+
$opt{stdio_cnt} = 'PERLIO_FILE_cnt(fp)';
284+
$opt{stdio_ptr} = 'PERLIO_FILE_ptr(fp)';
285+
$opt{i_stdbool} = 'define';
286+
}
280287
}
281288
#find out which MSVC this ICC is using
282289
elsif ($opt{cc} =~ /\bicl/) {
@@ -286,6 +293,13 @@ elsif ($opt{cc} =~ /\bicl/) {
286293
$opt{sGMTIME_max} = 32535291599;
287294
$opt{sLOCALTIME_max} = 32535244799;
288295
}
296+
if ($num_ver =~ /^(\d+)/ && $1 >= 19) { # VC14
297+
$opt{stdio_base} = 'PERLIO_FILE_base(fp)';
298+
$opt{stdio_bufsiz} = '(PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))';
299+
$opt{stdio_cnt} = 'PERLIO_FILE_cnt(fp)';
300+
$opt{stdio_ptr} = 'PERLIO_FILE_ptr(fp)';
301+
$opt{i_stdbool} = 'define';
302+
}
289303
$opt{ar} ='xilib';
290304
}
291305

win32/makefile.mk

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ USE_LARGE_FILES *= define
145145
#CCTYPE = MSVC120
146146
# Visual C++ 2013 Express Edition (aka Visual C++ 12.0) (free version)
147147
#CCTYPE = MSVC120FREE
148+
# Visual C++ 2015 (aka Visual C++ 14.0) (full version)
149+
#CCTYPE = MSVC140
150+
# Visual C++ 2015 Express Edition (aka Visual C++ 14.0) (free version)
151+
#CCTYPE = MSVC140FREE
148152
# MinGW or mingw-w64 with gcc-3.4.5 or later
149153
#CCTYPE = GCC
150154

@@ -606,7 +610,11 @@ DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT
606610
LOCDEFS = -DPERLDLL -DPERL_CORE
607611
CXX_FLAG = -TP -EHsc
608612

613+
.IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
614+
LIBC = ucrt.lib
615+
.ELSE
609616
LIBC = msvcrt.lib
617+
.ENDIF
610618

611619
.IF "$(CFG)" == "Debug"
612620
OPTIMIZE = -Od -MD -Zi -DDEBUGGING
@@ -615,7 +623,11 @@ LINK_DBG = -debug
615623
OPTIMIZE = -Od -MD -Zi
616624
LINK_DBG = -debug
617625
.ELIF "$(CFG)" == "DebugFull"
626+
.IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
627+
LIBC = ucrtd.lib
628+
.ELSE
618629
LIBC = msvcrtd.lib
630+
.ENDIF
619631
OPTIMIZE = -Od -MDd -Zi -D_DEBUG -DDEBUGGING
620632
LINK_DBG = -debug
621633
.ELSE
@@ -648,6 +660,11 @@ OPTIMIZE += -fp:precise
648660
DEFINES += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
649661
.ENDIF
650662

663+
# Likewise for deprecated Winsock APIs in VC++ 14.0 for now.
664+
.IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
665+
DEFINES = $(DEFINES) -D_WINSOCK_DEPRECATED_NO_WARNINGS
666+
.ENDIF
667+
651668
# In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to
652669
# 64-bit, even in 32-bit mode. It also provides the _USE_32BIT_TIME_T
653670
# preprocessor option to revert back to the old functionality for
@@ -667,6 +684,14 @@ LIBBASEFILES = oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
667684
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib \
668685
odbc32.lib odbccp32.lib comctl32.lib
669686

687+
.IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
688+
.IF "$(CFG)" == "DebugFull"
689+
LIBBASEFILES += msvcrtd.lib vcruntimed.lib
690+
.ELSE
691+
LIBBASEFILES += msvcrt.lib vcruntime.lib
692+
.ENDIF
693+
.ENDIF
694+
670695
# Avoid __intel_new_proc_init link error for libircmt.
671696
# libmmd is /MD equivelent, other variants exist.
672697
# libmmd is Intel C's math addon funcs to MS CRT, contains long doubles, C99,
@@ -1208,6 +1233,17 @@ $(MINIDIR)\.exists : $(CFGH_TMPL)
12081233
echo #undef NVgf&& \
12091234
echo #undef USE_LONG_DOUBLE&& \
12101235
echo #undef USE_CPLUSPLUS)>> config.h
1236+
.IF "$(CCTYPE)" == "MSVC140" || "$(CCTYPE)" == "MSVC140FREE"
1237+
@(echo #undef FILE_ptr&& \
1238+
echo #undef FILE_cnt&& \
1239+
echo #undef FILE_base&& \
1240+
echo #undef FILE_bufsiz&& \
1241+
echo #define FILE_ptr(fp) PERLIO_FILE_ptr(fp)&& \
1242+
echo #define FILE_cnt(fp) PERLIO_FILE_cnt(fp)&& \
1243+
echo #define FILE_base(fp) PERLIO_FILE_base(fp)&& \
1244+
echo #define FILE_bufsiz(fp) (PERLIO_FILE_cnt(fp) + PERLIO_FILE_ptr(fp) - PERLIO_FILE_base(fp))&& \
1245+
echo #define I_STDBOOL)>> config.h
1246+
.ENDIF
12111247
.IF "$(USE_LARGE_FILES)"=="define"
12121248
@(echo #define Off_t $(INT64)&& \
12131249
echo #define LSEEKSIZE ^8&& \

win32/perlhost.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -836,15 +836,15 @@ PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
836836
int fileno = win32_dup(win32_fileno(pf));
837837

838838
/* open the file in the same mode */
839-
if((pf)->_flag & _IOREAD) {
839+
if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RD) {
840840
mode[0] = 'r';
841841
mode[1] = 0;
842842
}
843-
else if((pf)->_flag & _IOWRT) {
843+
else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_WR) {
844844
mode[0] = 'a';
845845
mode[1] = 0;
846846
}
847-
else if((pf)->_flag & _IORW) {
847+
else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RW) {
848848
mode[0] = 'r';
849849
mode[1] = '+';
850850
mode[2] = 0;

win32/win32.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4161,15 +4161,15 @@ win32_fdupopen(FILE *pf)
41614161
int fileno = win32_dup(win32_fileno(pf));
41624162

41634163
/* open the file in the same mode */
4164-
if((pf)->_flag & _IOREAD) {
4164+
if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RD) {
41654165
mode[0] = 'r';
41664166
mode[1] = 0;
41674167
}
4168-
else if((pf)->_flag & _IOWRT) {
4168+
else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_WR) {
41694169
mode[0] = 'a';
41704170
mode[1] = 0;
41714171
}
4172-
else if((pf)->_flag & _IORW) {
4172+
else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RW) {
41734173
mode[0] = 'r';
41744174
mode[1] = '+';
41754175
mode[2] = 0;

0 commit comments

Comments
 (0)