aboutsummaryrefslogtreecommitdiff
path: root/gcc/d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2019-03-07 16:57:23 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-03-07 16:57:23 +0000
commit8f5439bea30bd2370638261ec7613628c8918d7d (patch)
treef26eba7fb1fa4abe08f558c03572201771d23362 /gcc/d
parent59d9a0aa71e3314f6a797fdfcce44ccfe8418b8d (diff)
downloadgcc-8f5439bea30bd2370638261ec7613628c8918d7d.zip
gcc-8f5439bea30bd2370638261ec7613628c8918d7d.tar.gz
gcc-8f5439bea30bd2370638261ec7613628c8918d7d.tar.bz2
d/dmd: Merge upstream dmd d517c0e6a
Fixes https://gcc.gnu.org/PR89016 Reviewed-on: https://github.com/dlang/dmd/pull/9427 From-SVN: r269465
Diffstat (limited to 'gcc/d')
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/attrib.c108
-rw-r--r--gcc/d/dmd/dimport.c4
-rw-r--r--gcc/d/dmd/dmodule.c12
-rw-r--r--gcc/d/dmd/expression.c37
-rw-r--r--gcc/d/dmd/expressionsem.c50
-rw-r--r--gcc/d/dmd/statement.c52
7 files changed, 115 insertions, 150 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 97aa40d..3f416db 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-ed71446aaa2bd0e548c3bf2154a638826dfe3db0
+d517c0e6a10b548f44d82b71b3c079663cb94f8e
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/attrib.c b/gcc/d/dmd/attrib.c
index e4ad573..a668638 100644
--- a/gcc/d/dmd/attrib.c
+++ b/gcc/d/dmd/attrib.c
@@ -30,6 +30,7 @@
bool definitelyValueParameter(Expression *e);
Expression *semantic(Expression *e, Scope *sc);
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s);
/********************************* AttribDeclaration ****************************/
@@ -977,41 +978,29 @@ void PragmaDeclaration::semantic(Scope *sc)
error("string expected for library name");
else
{
- Expression *e = (*args)[0];
-
- sc = sc->startCTFE();
- e = ::semantic(e, sc);
- e = resolveProperties(sc, e);
- sc = sc->endCTFE();
-
- e = e->ctfeInterpret();
- (*args)[0] = e;
- if (e->op == TOKerror)
- goto Lnodecl;
- StringExp *se = e->toStringExp();
+ StringExp *se = semanticString(sc, (*args)[0], "library name");
if (!se)
- error("string expected for library name, not '%s'", e->toChars());
- else
+ goto Lnodecl;
+ (*args)[0] = se;
+
+ char *name = (char *)mem.xmalloc(se->len + 1);
+ memcpy(name, se->string, se->len);
+ name[se->len] = 0;
+ if (global.params.verbose)
+ message("library %s", name);
+ if (global.params.moduleDeps && !global.params.moduleDepsFile)
{
- char *name = (char *)mem.xmalloc(se->len + 1);
- memcpy(name, se->string, se->len);
- name[se->len] = 0;
- if (global.params.verbose)
- message("library %s", name);
- if (global.params.moduleDeps && !global.params.moduleDepsFile)
- {
- OutBuffer *ob = global.params.moduleDeps;
- Module *imod = sc->instantiatingModule();
- ob->writestring("depsLib ");
- ob->writestring(imod->toPrettyChars());
- ob->writestring(" (");
- escapePath(ob, imod->srcfile->toChars());
- ob->writestring(") : ");
- ob->writestring((char *) name);
- ob->writenl();
- }
- mem.xfree(name);
+ OutBuffer *ob = global.params.moduleDeps;
+ Module *imod = sc->instantiatingModule();
+ ob->writestring("depsLib ");
+ ob->writestring(imod->toPrettyChars());
+ ob->writestring(" (");
+ escapePath(ob, imod->srcfile->toChars());
+ ob->writestring(") : ");
+ ob->writestring((char *) name);
+ ob->writenl();
}
+ mem.xfree(name);
}
goto Lnodecl;
}
@@ -1053,19 +1042,11 @@ void PragmaDeclaration::semantic(Scope *sc)
goto Ldecl;
}
- Expression *e = (*args)[0];
- e = ::semantic(e, sc);
- e = e->ctfeInterpret();
- (*args)[0] = e;
- if (e->op == TOKerror)
- goto Ldecl;
-
- StringExp *se = e->toStringExp();
+ StringExp *se = semanticString(sc, (*args)[0], "mangled name");
if (!se)
- {
- error("string expected for mangled name, not '%s'", e->toChars());
goto Ldecl;
- }
+ (*args)[0] = se; // Will be used for later
+
if (!se->len)
{
error("zero-length string not allowed for mangled name");
@@ -1418,35 +1399,22 @@ void CompileDeclaration::setScope(Scope *sc)
void CompileDeclaration::compileIt(Scope *sc)
{
//printf("CompileDeclaration::compileIt(loc = %d) %s\n", loc.linnum, exp->toChars());
- sc = sc->startCTFE();
- exp = ::semantic(exp, sc);
- exp = resolveProperties(sc, exp);
- sc = sc->endCTFE();
+ StringExp *se = semanticString(sc, exp, "argument to mixin");
+ if (!se)
+ return;
+ se = se->toUTF8(sc);
+
+ unsigned errors = global.errors;
+ Parser p(loc, sc->_module, (utf8_t *)se->string, se->len, 0);
+ p.nextToken();
- if (exp->op != TOKerror)
+ decl = p.parseDeclDefs(0);
+ if (p.token.value != TOKeof)
+ exp->error("incomplete mixin declaration (%s)", se->toChars());
+ if (p.errors)
{
- Expression *e = exp->ctfeInterpret();
- if (e->op == TOKerror) // Bugzilla 15974
- return;
- StringExp *se = e->toStringExp();
- if (!se)
- exp->error("argument to mixin must be a string, not (%s) of type %s", exp->toChars(), exp->type->toChars());
- else
- {
- se = se->toUTF8(sc);
- unsigned errors = global.errors;
- Parser p(loc, sc->_module, (utf8_t *)se->string, se->len, 0);
- p.nextToken();
-
- decl = p.parseDeclDefs(0);
- if (p.token.value != TOKeof)
- exp->error("incomplete mixin declaration (%s)", se->toChars());
- if (p.errors)
- {
- assert(global.errors != errors);
- decl = NULL;
- }
- }
+ assert(global.errors != errors);
+ decl = NULL;
}
}
diff --git a/gcc/d/dmd/dimport.c b/gcc/d/dmd/dimport.c
index ad1e2d0..cd2c5b2 100644
--- a/gcc/d/dmd/dimport.c
+++ b/gcc/d/dmd/dimport.c
@@ -23,6 +23,8 @@
#include "attrib.h"
#include "hdrgen.h"
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s);
+
/********************************* Import ****************************/
Import::Import(Loc loc, Identifiers *packages, Identifier *id, Identifier *aliasId,
@@ -176,6 +178,8 @@ void Import::importAll(Scope *sc)
if (mod->md && mod->md->isdeprecated)
{
Expression *msg = mod->md->msg;
+ if (msg)
+ msg = semanticString(sc, msg, "deprecation message");
if (StringExp *se = msg ? msg->toStringExp() : NULL)
mod->deprecation(loc, "is deprecated - %s", se->string);
else
diff --git a/gcc/d/dmd/dmodule.c b/gcc/d/dmd/dmodule.c
index 3b74446..20dbb69 100644
--- a/gcc/d/dmd/dmodule.c
+++ b/gcc/d/dmd/dmodule.c
@@ -35,6 +35,7 @@ Dsymbols Module::deferred3; // deferred Dsymbol's needing semantic3() run on the
unsigned Module::dprogress;
const char *lookForSourceFile(const char **path, const char *filename);
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s);
void Module::_init()
{
@@ -727,14 +728,6 @@ void Module::importAll(Scope *)
return;
}
- if (md && md->msg)
- {
- if (StringExp *se = md->msg->toStringExp())
- md->msg = se;
- else
- md->msg->error("string expected, not '%s'", md->msg->toChars());
- }
-
/* Note that modules get their own scope, from scratch.
* This is so regardless of where in the syntax a module
* gets imported, it is unaffected by context.
@@ -742,6 +735,9 @@ void Module::importAll(Scope *)
*/
Scope *sc = Scope::createGlobal(this); // create root scope
+ if (md && md->msg)
+ md->msg = semanticString(sc, md->msg, "deprecation message");
+
// Add import of "object", even for the "object" module.
// If it isn't there, some compiler rewrites, like
// classinst == classinst -> .object.opEquals(classinst, classinst)
diff --git a/gcc/d/dmd/expression.c b/gcc/d/dmd/expression.c
index cbc3819..df37392 100644
--- a/gcc/d/dmd/expression.c
+++ b/gcc/d/dmd/expression.c
@@ -6850,6 +6850,43 @@ Expression *resolveOpDollar(Scope *sc, ArrayExp *ae, Expression **pe0)
return ae;
}
+/***********************************************************
+ * Resolve `exp` as a compile-time known string.
+ * Params:
+ * sc = scope
+ * exp = Expression which expected as a string
+ * s = What the string is expected for, will be used in error diagnostic.
+ * Returns:
+ * String literal, or `null` if error happens.
+ */
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s)
+{
+ sc = sc->startCTFE();
+ exp = semantic(exp, sc);
+ exp = resolveProperties(sc, exp);
+ sc = sc->endCTFE();
+
+ if (exp->op == TOKerror)
+ return NULL;
+
+ Expression *e = exp;
+ if (exp->type->isString())
+ {
+ e = e->ctfeInterpret();
+ if (e->op == TOKerror)
+ return NULL;
+ }
+
+ StringExp *se = e->toStringExp();
+ if (!se)
+ {
+ exp->error("string expected for %s, not (%s) of type %s",
+ s, exp->toChars(), exp->type->toChars());
+ return NULL;
+ }
+ return se;
+}
+
/**************************************
* Runs semantic on se->lwr and se->upr. Declares a temporary variable
* if '$' was used.
diff --git a/gcc/d/dmd/expressionsem.c b/gcc/d/dmd/expressionsem.c
index d5319e5..3fd5c1f 100644
--- a/gcc/d/dmd/expressionsem.c
+++ b/gcc/d/dmd/expressionsem.c
@@ -74,6 +74,7 @@ Expression *binSemanticProp(BinExp *e, Scope *sc);
Expression *semantic(Expression *e, Scope *sc);
Expression *semanticY(DotIdExp *exp, Scope *sc, int flag);
Expression *semanticY(DotTemplateInstanceExp *exp, Scope *sc, int flag);
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s);
/****************************************
* Preprocess arguments to function.
@@ -2259,27 +2260,9 @@ public:
void visit(CompileExp *exp)
{
- sc = sc->startCTFE();
- exp->e1 = semantic(exp->e1, sc);
- exp->e1 = resolveProperties(sc, exp->e1);
- sc = sc->endCTFE();
- if (exp->e1->op == TOKerror)
- {
- result = exp->e1;
- return;
- }
- if (!exp->e1->type->isString())
- {
- exp->error("argument to mixin must be a string type, not %s", exp->e1->type->toChars());
- return setError();
- }
- exp->e1 = exp->e1->ctfeInterpret();
- StringExp *se = exp->e1->toStringExp();
+ StringExp *se = semanticString(sc, exp->e1, "argument to mixin");
if (!se)
- {
- exp->error("argument to mixin must be a string, not (%s)", exp->e1->toChars());
return setError();
- }
se = se->toUTF8(sc);
unsigned errors = global.errors;
Parser p(exp->loc, sc->_module, (utf8_t *)se->string, se->len, 0);
@@ -2301,27 +2284,16 @@ public:
void visit(ImportExp *e)
{
- const char *name;
- StringExp *se;
-
- sc = sc->startCTFE();
- e->e1 = semantic(e->e1, sc);
- e->e1 = resolveProperties(sc, e->e1);
- sc = sc->endCTFE();
- e->e1 = e->e1->ctfeInterpret();
- if (e->e1->op != TOKstring)
- {
- e->error("file name argument must be a string, not (%s)", e->e1->toChars());
- goto Lerror;
- }
- se = (StringExp *)e->e1;
+ StringExp *se = semanticString(sc, e->e1, "file name argument");
+ if (!se)
+ return setError();
se = se->toUTF8(sc);
- name = (char *)se->string;
+ const char *name = (char *)se->string;
if (!global.params.fileImppath)
{
e->error("need -Jpath switch to import text file %s", name);
- goto Lerror;
+ return setError();
}
/* Be wary of CWE-22: Improper Limitation of a Pathname to a Restricted Directory
@@ -2333,7 +2305,7 @@ public:
if (!name)
{
e->error("file %s cannot be found or not in a path specified with -J", se->toChars());
- goto Lerror;
+ return setError();
}
if (global.params.verbose)
@@ -2363,7 +2335,7 @@ public:
if (f.read())
{
e->error("cannot read file %s", f.toChars());
- goto Lerror;
+ return setError();
}
else
{
@@ -2372,10 +2344,6 @@ public:
}
}
result = semantic(se, sc);
- return;
-
- Lerror:
- return setError();
}
void visit(AssertExp *exp)
diff --git a/gcc/d/dmd/statement.c b/gcc/d/dmd/statement.c
index 95bb772..2d3a112 100644
--- a/gcc/d/dmd/statement.c
+++ b/gcc/d/dmd/statement.c
@@ -31,6 +31,7 @@ StorageClass mergeFuncAttrs(StorageClass s1, FuncDeclaration *f);
bool checkEscapeRef(Scope *sc, Expression *e, bool gag);
VarDeclaration *copyToTemp(StorageClass stc, const char *name, Expression *e);
Expression *semantic(Expression *e, Scope *sc);
+StringExp *semanticString(Scope *sc, Expression *exp, const char *s);
Identifier *fixupLabelName(Scope *sc, Identifier *ident)
{
@@ -487,45 +488,36 @@ Statement *CompileStatement::syntaxCopy()
return new CompileStatement(loc, exp->syntaxCopy());
}
+static Statements *errorStatements()
+{
+ Statements *a = new Statements();
+ a->push(new ErrorStatement());
+ return a;
+}
+
Statements *CompileStatement::flatten(Scope *sc)
{
//printf("CompileStatement::flatten() %s\n", exp->toChars());
- sc = sc->startCTFE();
- exp = semantic(exp, sc);
- exp = resolveProperties(sc, exp);
- sc = sc->endCTFE();
+ StringExp *se = semanticString(sc, exp, "argument to mixin");
+ if (!se)
+ return errorStatements();
+ se = se->toUTF8(sc);
+
+ unsigned errors = global.errors;
+ Parser p(loc, sc->_module, (utf8_t *)se->string, se->len, 0);
+ p.nextToken();
Statements *a = new Statements();
- if (exp->op != TOKerror)
+ while (p.token.value != TOKeof)
{
- Expression *e = exp->ctfeInterpret();
- if (e->op == TOKerror) // Bugzilla 15974
- goto Lerror;
- StringExp *se = e->toStringExp();
- if (!se)
- error("argument to mixin must be a string, not (%s) of type %s", exp->toChars(), exp->type->toChars());
- else
+ Statement *s = p.parseStatement(PSsemi | PScurlyscope);
+ if (!s || p.errors)
{
- se = se->toUTF8(sc);
- unsigned errors = global.errors;
- Parser p(loc, sc->_module, (utf8_t *)se->string, se->len, 0);
- p.nextToken();
-
- while (p.token.value != TOKeof)
- {
- Statement *s = p.parseStatement(PSsemi | PScurlyscope);
- if (!s || p.errors)
- {
- assert(!p.errors || global.errors != errors); // make sure we caught all the cases
- goto Lerror;
- }
- a->push(s);
- }
- return a;
+ assert(!p.errors || global.errors != errors); // make sure we caught all the cases
+ return errorStatements();
}
+ a->push(s);
}
-Lerror:
- a->push(new ErrorStatement());
return a;
}