aboutsummaryrefslogtreecommitdiff
path: root/gcc/d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2019-03-26 14:40:06 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-03-26 14:40:06 +0000
commitecbb1530e317e8b405d29dead5b080fe2ef9f50c (patch)
tree999523995b74fc9b4bf531a6cabba421735f4b1b /gcc/d
parent465b8e7f4ecb9af118419dbf14a43cb95e1d12dd (diff)
downloadgcc-ecbb1530e317e8b405d29dead5b080fe2ef9f50c.zip
gcc-ecbb1530e317e8b405d29dead5b080fe2ef9f50c.tar.gz
gcc-ecbb1530e317e8b405d29dead5b080fe2ef9f50c.tar.bz2
d/dmd: Merge upstream dmd ab702e73e
Fixes memory leak in the front-end symbol mangler, and introduces recognition and rejection of a few more C types and directives. Reviewed-on: https://github.com/dlang/dmd/pull/9492 From-SVN: r269945
Diffstat (limited to 'gcc/d')
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/dmangle.c3
-rw-r--r--gcc/d/dmd/dscope.c10
-rw-r--r--gcc/d/dmd/idgen.c9
-rw-r--r--gcc/d/dmd/lexer.c21
-rw-r--r--gcc/d/dmd/parse.c18
6 files changed, 46 insertions, 17 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 3017f0d..ffad6cb 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-74ac873be1862090b7ec0e4a876fd1b758520359
+ab702e73e56aefb3b77b8f8f42da94bc22143eeb
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/dmangle.c b/gcc/d/dmd/dmangle.c
index 7f13947..44f4f82 100644
--- a/gcc/d/dmd/dmangle.c
+++ b/gcc/d/dmd/dmangle.c
@@ -306,8 +306,9 @@ public:
buf2.reserve(32);
Mangler v(&buf2);
v.paramsToDecoBuffer(t->arguments);
+ const char *s = buf2.peekString();
int len = (int)buf2.offset;
- buf->printf("%d%.*s", len, len, buf2.extractData());
+ buf->printf("%d%.*s", len, len, s);
}
void visit(TypeNull *t)
diff --git a/gcc/d/dmd/dscope.c b/gcc/d/dmd/dscope.c
index 27c3fd5..def448a 100644
--- a/gcc/d/dmd/dscope.c
+++ b/gcc/d/dmd/dscope.c
@@ -685,14 +685,16 @@ Dsymbol *Scope::search_correct(Identifier *ident)
const char *Scope::search_correct_C(Identifier *ident)
{
TOK tok;
- if (ident == Id::_NULL)
+ if (ident == Id::C_NULL)
tok = TOKnull;
- else if (ident == Id::_TRUE)
+ else if (ident == Id::C_TRUE)
tok = TOKtrue;
- else if (ident == Id::_FALSE)
+ else if (ident == Id::C_FALSE)
tok = TOKfalse;
- else if (ident == Id::_unsigned)
+ else if (ident == Id::C_unsigned)
tok = TOKuns32;
+ else if (ident == Id::C_wchar_t)
+ tok = global.params.isWindows ? TOKwchar : TOKdchar;
else
return NULL;
return Token::toChars(tok);
diff --git a/gcc/d/dmd/idgen.c b/gcc/d/dmd/idgen.c
index ec26b2c..e750048 100644
--- a/gcc/d/dmd/idgen.c
+++ b/gcc/d/dmd/idgen.c
@@ -374,10 +374,11 @@ Msgtable msgtable[] =
{ "udaSelector", "selector" },
// C names, for undefined identifier error messages
- { "_NULL", "NULL" },
- { "_TRUE", "TRUE" },
- { "_FALSE", "FALSE" },
- { "_unsigned", "unsigned" },
+ { "C_NULL", "NULL" },
+ { "C_TRUE", "TRUE" },
+ { "C_FALSE", "FALSE" },
+ { "C_unsigned", "unsigned" },
+ { "C_wchar_t", "wchar_t" },
};
diff --git a/gcc/d/dmd/lexer.c b/gcc/d/dmd/lexer.c
index b466f17..8a2c90f 100644
--- a/gcc/d/dmd/lexer.c
+++ b/gcc/d/dmd/lexer.c
@@ -901,16 +901,25 @@ void Lexer::scan(Token *t)
p++;
Token n;
scan(&n);
- if (n.value == TOKidentifier && n.ident == Id::line)
+ if (n.value == TOKidentifier)
{
- poundLine();
- continue;
+ if (n.ident == Id::line)
+ {
+ poundLine();
+ continue;
+ }
+ else
+ {
+ const Loc locx = loc();
+ warning(locx, "C preprocessor directive `#%s` is not supported", n.ident->toChars());
+ }
}
- else
+ else if (n.value == TOKif)
{
- t->value = TOKpound;
- return;
+ error("C preprocessor directive `#if` is not supported, use `version` or `static if`");
}
+ t->value = TOKpound;
+ return;
}
default:
diff --git a/gcc/d/dmd/parse.c b/gcc/d/dmd/parse.c
index e0ee299..3afdbc2 100644
--- a/gcc/d/dmd/parse.c
+++ b/gcc/d/dmd/parse.c
@@ -3076,7 +3076,23 @@ Type *Parser::parseBasicType(bool dontLookDotIdents)
case TOKuns16: t = Type::tuns16; goto LabelX;
case TOKint32: t = Type::tint32; goto LabelX;
case TOKuns32: t = Type::tuns32; goto LabelX;
- case TOKint64: t = Type::tint64; goto LabelX;
+ case TOKint64:
+ t = Type::tint64;
+ nextToken();
+ if (token.value == TOKint64) // if `long long`
+ {
+ error("use `long` for a 64 bit integer instead of `long long`");
+ nextToken();
+ }
+ else if (token.value == TOKfloat64) // if `long double`
+ {
+ error("use `real` instead of `long double`");
+ t = Type::tfloat80;
+ nextToken();
+
+ }
+ break;
+
case TOKuns64: t = Type::tuns64; goto LabelX;
case TOKint128: t = Type::tint128; goto LabelX;
case TOKuns128: t = Type::tuns128; goto LabelX;