@@ -105,13 +105,14 @@ void Prescanner::Statement() {
105
105
NextLine ();
106
106
return ;
107
107
case LineClassification::Kind::ConditionalCompilationDirective:
108
- case LineClassification::Kind::DefinitionDirective:
109
- case LineClassification::Kind::PreprocessorDirective:
108
+ case LineClassification::Kind::IncludeDirective:
110
109
preprocessor_.Directive (TokenizePreprocessorDirective (), *this );
110
+ afterPreprocessingDirective_ = true ;
111
111
return ;
112
- case LineClassification::Kind::IncludeDirective:
112
+ case LineClassification::Kind::PreprocessorDirective:
113
+ case LineClassification::Kind::DefinitionDirective:
113
114
preprocessor_.Directive (TokenizePreprocessorDirective (), *this );
114
- afterIncludeDirective_ = true ;
115
+ // Don't set afterPreprocessingDirective_
115
116
return ;
116
117
case LineClassification::Kind::CompilerDirective: {
117
118
directiveSentinel_ = line.sentinel ;
@@ -289,13 +290,14 @@ void Prescanner::CheckAndEmitLine(
289
290
tokens.CheckBadFortranCharacters (
290
291
messages_, *this , disableSourceContinuation_);
291
292
// Parenthesis nesting check does not apply while any #include is
292
- // active, nor on the lines before and after a top-level #include.
293
+ // active, nor on the lines before and after a top-level #include,
294
+ // nor before or after conditional source.
293
295
// Applications play shenanigans with line continuation before and
294
- // after #include'd subprogram argument lists.
296
+ // after #include'd subprogram argument lists and conditional source .
295
297
if (!isNestedInIncludeDirective_ && !omitNewline_ &&
296
- !afterIncludeDirective_ && tokens.BadlyNestedParentheses ()) {
297
- if (inFixedForm_ && nextLine_ < limit_ &&
298
- IsPreprocessorDirectiveLine (nextLine_)) {
298
+ !afterPreprocessingDirective_ && tokens.BadlyNestedParentheses () &&
299
+ !preprocessor_. InConditional ()) {
300
+ if (nextLine_ < limit_ && IsPreprocessorDirectiveLine (nextLine_)) {
299
301
// don't complain
300
302
} else {
301
303
tokens.CheckBadParentheses (messages_);
@@ -306,7 +308,7 @@ void Prescanner::CheckAndEmitLine(
306
308
omitNewline_ = false ;
307
309
} else {
308
310
cooked_.Put (' \n ' , newlineProvenance);
309
- afterIncludeDirective_ = false ;
311
+ afterPreprocessingDirective_ = false ;
310
312
}
311
313
}
312
314
@@ -1069,6 +1071,17 @@ bool Prescanner::SkipCommentLine(bool afterAmpersand) {
1069
1071
return true ;
1070
1072
} else if (inPreprocessorDirective_) {
1071
1073
return false ;
1074
+ } else if (afterAmpersand &&
1075
+ (lineClass.kind ==
1076
+ LineClassification::Kind::ConditionalCompilationDirective ||
1077
+ lineClass.kind == LineClassification::Kind::DefinitionDirective ||
1078
+ lineClass.kind == LineClassification::Kind::PreprocessorDirective ||
1079
+ lineClass.kind == LineClassification::Kind::IncludeDirective ||
1080
+ lineClass.kind == LineClassification::Kind::IncludeLine)) {
1081
+ SkipToEndOfLine ();
1082
+ omitNewline_ = true ;
1083
+ skipLeadingAmpersand_ = true ;
1084
+ return false ;
1072
1085
} else if (lineClass.kind ==
1073
1086
LineClassification::Kind::ConditionalCompilationDirective ||
1074
1087
lineClass.kind == LineClassification::Kind::PreprocessorDirective) {
@@ -1080,13 +1093,6 @@ bool Prescanner::SkipCommentLine(bool afterAmpersand) {
1080
1093
// continued line).
1081
1094
preprocessor_.Directive (TokenizePreprocessorDirective (), *this );
1082
1095
return true ;
1083
- } else if (afterAmpersand &&
1084
- (lineClass.kind == LineClassification::Kind::IncludeDirective ||
1085
- lineClass.kind == LineClassification::Kind::IncludeLine)) {
1086
- SkipToEndOfLine ();
1087
- omitNewline_ = true ;
1088
- skipLeadingAmpersand_ = true ;
1089
- return false ;
1090
1096
} else {
1091
1097
return false ;
1092
1098
}
0 commit comments