]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Fix qualifier ignored in alias definition if parentheses are not present
authorIain Buclaw <ibuclaw@gdcproject.org>
Mon, 10 May 2021 10:03:19 +0000 (12:03 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Mon, 10 May 2021 10:14:49 +0000 (12:14 +0200)
Fixes regression where the qualifier was ignored in an alias definition
if parentheses were not present.

Reviewed-on: https://github.com/dlang/dmd/pull/12504

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd b7d146c4c.

gcc/d/dmd/MERGE
gcc/d/dmd/dsymbolsem.c
gcc/testsuite/gdc.test/compilable/test21898.d [new file with mode: 0644]

index 86fb308d7599a963745a1156478eb5a8b1ae6993..d29d462f42f75e0499bb7df2b7dd40e70e01014c 100644 (file)
@@ -1,4 +1,4 @@
-0450061c8de71328815da9323bd35c92b37d51d2
+b7d146c4c34469f876a63f26ff19091a7f9d54d7
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 33f74edf6ba8e6b0e1f22753a6800a1d7b8b8100..7a44ed2c41d859d64192431e6929d5be83001682 100644 (file)
@@ -4880,8 +4880,11 @@ static void aliasInstanceSemantic(TemplateInstance *tempinst, Scope *sc, Templat
 
     TemplateTypeParameter *ttp = (*tempdecl->parameters)[0]->isTemplateTypeParameter();
     Type *ta = isType(tempinst->tdtypes[0]);
-    Declaration *d = new AliasDeclaration(tempinst->loc, ttp->ident, ta->addMod(tempdecl->onemember->isAliasDeclaration()->type->mod));
-    d->storage_class |= STCtemplateparameter;
+    AliasDeclaration *ad = tempdecl->onemember->isAliasDeclaration();
+
+    // Note: qualifiers can be in both 'ad.type.mod' and 'ad.storage_class'
+    Declaration *d = new AliasDeclaration(tempinst->loc, ttp->ident, ta->addMod(ad->type->mod));
+    d->storage_class |= STCtemplateparameter | ad->storage_class;
     dsymbolSemantic(d, sc);
 
     paramscope->pop();
diff --git a/gcc/testsuite/gdc.test/compilable/test21898.d b/gcc/testsuite/gdc.test/compilable/test21898.d
new file mode 100644 (file)
index 0000000..9ac18b8
--- /dev/null
@@ -0,0 +1,7 @@
+// https://issues.dlang.org/show_bug.cgi?id=21898
+
+alias Works(T) = immutable(T);
+alias Fails(T) = immutable T;
+
+static assert(is(Works!int == immutable int));
+static assert(is(Fails!int == immutable int));