Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Dynare
preprocessor
Commits
bd64c91c
Unverified
Commit
bd64c91c
authored
Nov 02, 2020
by
Sébastien Villemot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix the interpretation of @#elseif clauses within an @#ifdef or @#ifndef
(cherry picked from commit
5d564eed
)
parent
8207886e
Pipeline
#4307
passed with stages
in 2 minutes and 53 seconds
Changes
2
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
32 additions
and
44 deletions
+32
-44
src/macro/Directives.cc
src/macro/Directives.cc
+25
-37
src/macro/Directives.hh
src/macro/Directives.hh
+7
-7
No files found.
src/macro/Directives.cc
View file @
bd64c91c
...
@@ -245,8 +245,23 @@ For::interpret(ostream &output, vector<filesystem::path> &paths)
...
@@ -245,8 +245,23 @@ For::interpret(ostream &output, vector<filesystem::path> &paths)
void
void
If
::
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
If
::
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
{
{
bool
first_clause
=
true
;
for
(
const
auto
&
[
expr
,
body
]
:
expr_and_body
)
for
(
const
auto
&
[
expr
,
body
]
:
expr_and_body
)
try
try
{
if
((
ifdef
||
ifndef
)
&&
first_clause
)
{
first_clause
=
false
;
VariablePtr
vp
=
dynamic_pointer_cast
<
Variable
>
(
expr
);
assert
(
vp
);
if
((
ifdef
&&
env
.
isVariableDefined
(
vp
->
getName
()))
||
(
ifndef
&&
!
env
.
isVariableDefined
(
vp
->
getName
())))
{
interpretBody
(
body
,
output
,
paths
);
break
;
}
}
else
{
{
auto
tmp
=
expr
->
eval
();
auto
tmp
=
expr
->
eval
();
RealPtr
dp
=
dynamic_pointer_cast
<
Real
>
(
tmp
);
RealPtr
dp
=
dynamic_pointer_cast
<
Real
>
(
tmp
);
...
@@ -260,6 +275,7 @@ If::interpret(ostream &output, vector<filesystem::path> &paths)
...
@@ -260,6 +275,7 @@ If::interpret(ostream &output, vector<filesystem::path> &paths)
break
;
break
;
}
}
}
}
}
catch
(
StackTrace
&
ex
)
catch
(
StackTrace
&
ex
)
{
{
ex
.
push
(
"@#if"
,
location
);
ex
.
push
(
"@#if"
,
location
);
...
@@ -286,31 +302,3 @@ If::interpretBody(const vector<DirectivePtr> &body, ostream &output, vector<file
...
@@ -286,31 +302,3 @@ If::interpretBody(const vector<DirectivePtr> &body, ostream &output, vector<file
statement
->
interpret
(
output
,
paths
);
statement
->
interpret
(
output
,
paths
);
}
}
}
}
void
Ifdef
::
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
{
for
(
const
auto
&
[
expr
,
body
]
:
expr_and_body
)
if
(
VariablePtr
vp
=
dynamic_pointer_cast
<
Variable
>
(
expr
);
dynamic_pointer_cast
<
BaseType
>
(
expr
)
||
(
vp
&&
env
.
isVariableDefined
(
vp
->
getName
())))
{
interpretBody
(
body
,
output
,
paths
);
break
;
}
printEndLineInfo
(
output
);
}
void
Ifndef
::
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
{
for
(
const
auto
&
[
expr
,
body
]
:
expr_and_body
)
if
(
VariablePtr
vp
=
dynamic_pointer_cast
<
Variable
>
(
expr
);
dynamic_pointer_cast
<
BaseType
>
(
expr
)
||
(
vp
&&
!
env
.
isVariableDefined
(
vp
->
getName
())))
{
interpretBody
(
body
,
output
,
paths
);
break
;
}
printEndLineInfo
(
output
);
}
src/macro/Directives.hh
View file @
bd64c91c
...
@@ -175,24 +175,25 @@ namespace macro
...
@@ -175,24 +175,25 @@ namespace macro
* If there is an `else` statement it is the last element in the vector. Its condition is true.
* If there is an `else` statement it is the last element in the vector. Its condition is true.
*/
*/
const
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body
;
const
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body
;
const
bool
ifdef
,
ifndef
;
public:
public:
If
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
If
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
)
:
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
,
Directive
(
env_arg
,
move
(
location_arg
)),
expr_and_body
{
move
(
expr_and_body_arg
)}
{
}
bool
ifdef_arg
=
false
,
bool
ifndef_arg
=
false
)
:
Directive
(
env_arg
,
move
(
location_arg
)),
expr_and_body
{
move
(
expr_and_body_arg
)},
ifdef
{
ifdef_arg
},
ifndef
{
ifndef_arg
}
{
}
void
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
override
;
void
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
override
;
protected:
protected:
void
interpretBody
(
const
vector
<
DirectivePtr
>
&
body
,
ostream
&
output
,
void
interpretBody
(
const
vector
<
DirectivePtr
>
&
body
,
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
);
vector
<
filesystem
::
path
>
&
paths
);
};
};
class
Ifdef
:
public
If
class
Ifdef
:
public
If
{
{
public:
public:
Ifdef
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
Ifdef
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
)
:
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
)
:
If
(
move
(
expr_and_body_arg
),
env_arg
,
move
(
location_arg
))
{
}
If
(
move
(
expr_and_body_arg
),
env_arg
,
move
(
location_arg
),
true
,
false
)
{
}
void
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
override
;
};
};
...
@@ -201,8 +202,7 @@ namespace macro
...
@@ -201,8 +202,7 @@ namespace macro
public:
public:
Ifndef
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
Ifndef
(
vector
<
pair
<
ExpressionPtr
,
vector
<
DirectivePtr
>>>
expr_and_body_arg
,
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
)
:
Environment
&
env_arg
,
Tokenizer
::
location
location_arg
)
:
If
(
move
(
expr_and_body_arg
),
env_arg
,
move
(
location_arg
))
{
}
If
(
move
(
expr_and_body_arg
),
env_arg
,
move
(
location_arg
),
false
,
true
)
{
}
void
interpret
(
ostream
&
output
,
vector
<
filesystem
::
path
>
&
paths
)
override
;
};
};
}
}
#endif
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment