aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-11-08 17:45:33 +0100
committerMartin Odersky <odersky@gmail.com>2015-11-09 15:45:40 +0100
commit820bd7ec55bc8ef621204dc82f56a80e2d2459f0 (patch)
tree84b5f8e1e68b61a4d66f70edb12b9750ecb81c13
parent27e65efdf56f7fc9968d3a9ee63022aa9dc34a24 (diff)
downloaddotty-820bd7ec55bc8ef621204dc82f56a80e2d2459f0.tar.gz
dotty-820bd7ec55bc8ef621204dc82f56a80e2d2459f0.tar.bz2
dotty-820bd7ec55bc8ef621204dc82f56a80e2d2459f0.zip
Avoid taking references before toplevel symbols are entered.
Taking a reference means that the symbol will be brought forward into the current run, then if the same symbol is entered from source, a datarace ensues. This affected the ProductN symbols because these are automatically added to a case class suring desugaring.
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala2
-rw-r--r--src/dotty/tools/dotc/ast/untpd.scala4
-rw-r--r--src/dotty/tools/dotc/core/Types.scala2
-rw-r--r--src/dotty/tools/dotc/parsing/JavaParsers.scala4
-rw-r--r--src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala2
-rw-r--r--test/dotc/scala-collections.whitelist48
6 files changed, 30 insertions, 32 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 36c99a12b..6c914c934 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -323,7 +323,7 @@ object desugar {
def anyRef = ref(defn.AnyRefAlias.typeRef)
def productConstr(n: Int) = {
- val tycon = ref(defn.ProductNType(n))
+ val tycon = scalaDot((tpnme.Product.toString + n).toTypeName)
val targs = constrVparamss.head map (_.tpt)
if (targs.isEmpty) tycon else AppliedTypeTree(tycon, targs)
}
diff --git a/src/dotty/tools/dotc/ast/untpd.scala b/src/dotty/tools/dotc/ast/untpd.scala
index 3f3e1bf37..28a3cf1ff 100644
--- a/src/dotty/tools/dotc/ast/untpd.scala
+++ b/src/dotty/tools/dotc/ast/untpd.scala
@@ -201,7 +201,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
def ref(tp: NamedType)(implicit ctx: Context): Tree =
TypedSplice(tpd.ref(tp))
- def scalaUnit(implicit ctx: Context) = ref(defn.UnitType)
+ def rootDot(name: Name) = Select(Ident(nme.ROOTPKG), name)
+ def scalaDot(name: Name) = Select(rootDot(nme.scala_), name)
+ def scalaUnit = scalaDot(tpnme.Unit)
def makeConstructor(tparams: List[TypeDef], vparamss: List[List[ValDef]], rhs: Tree = EmptyTree)(implicit ctx: Context): DefDef =
DefDef(nme.CONSTRUCTOR, tparams, vparamss, TypeTree(), rhs)
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index 4cae047a9..2c310aea4 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -1387,7 +1387,7 @@ object Types {
(lastSymbol.infoOrCompleter == ErrorType ||
sym.owner.derivesFrom(lastSymbol.owner) && sym.owner != lastSymbol.owner
),
- s"data race? overwriting symbol of ${this.show} / $this / ${this.getClass} / ${lastSymbol.id} / ${sym.id} / ${sym.owner} / ${lastSymbol.owner} / ${ctx.phase}")
+ s"data race? overwriting symbol of ${this.show} / $this / ${this.getClass} / ${lastSymbol.id} / ${sym.id} / ${sym.owner} / ${lastSymbol.owner} / ${ctx.phase} at run ${ctx.runId}")
protected def sig: Signature = Signature.NotAMethod
diff --git a/src/dotty/tools/dotc/parsing/JavaParsers.scala b/src/dotty/tools/dotc/parsing/JavaParsers.scala
index 52bcdb965..be7822cdc 100644
--- a/src/dotty/tools/dotc/parsing/JavaParsers.scala
+++ b/src/dotty/tools/dotc/parsing/JavaParsers.scala
@@ -92,12 +92,10 @@ object JavaParsers {
// --------- tree building -----------------------------
- def rootId(name: Name) = Select(Ident(nme.ROOTPKG), name)
- def scalaDot(name: Name) = Select(Ident(nme.scala_), name)
def scalaAnnotationDot(name: Name) = Select(scalaDot(nme.annotation), name)
def javaDot(name: Name): Tree =
- Select(rootId(nme.java), name)
+ Select(rootDot(nme.java), name)
def javaLangDot(name: Name): Tree =
Select(javaDot(nme.lang), name)
diff --git a/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala b/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
index 46d2a450e..20b655a19 100644
--- a/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
+++ b/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
@@ -70,7 +70,7 @@ class SymbolicXMLBuilder(parser: Parser, preserveWS: Boolean)(implicit ctx: Cont
private def const(x: Any) = Literal(Constant(x))
private def wild = Ident(nme.WILDCARD)
private def wildStar = Ident(tpnme.WILDCARD_STAR)
- private def _scala(name: Name) = Select(Select(Ident(nme.ROOTPKG), nme.scala_), name)
+ private def _scala(name: Name) = scalaDot(name)
private def _scala_xml(name: Name) = Select(_scala(_xml), name)
private def _scala_xml_Comment = _scala_xml(_Comment)
diff --git a/test/dotc/scala-collections.whitelist b/test/dotc/scala-collections.whitelist
index 27b1bc5ae..3a8611a20 100644
--- a/test/dotc/scala-collections.whitelist
+++ b/test/dotc/scala-collections.whitelist
@@ -56,31 +56,29 @@
./scala-scala/src/library/scala/PartialFunction.scala
./scala-scala/src/library/scala/Predef.scala
-# Causes data races #907
-# java.lang.AssertionError: assertion failed: data race? overwriting symbol of Product1 / TypeRef(ThisType(TypeRef(NoPrefix,scala)),Product1) / class dotty.tools.dotc.core.Types$CachedTypeRef / 190 / 4820 / module class scala / module class scala / frontend, took 2.154 sec
-#./scala-scala/src/library/scala/Product.scala
-#./scala-scala/src/library/scala/Product1.scala
-#./scala-scala/src/library/scala/Product10.scala
-#./scala-scala/src/library/scala/Product11.scala
-#./scala-scala/src/library/scala/Product12.scala
-#./scala-scala/src/library/scala/Product13.scala
-#./scala-scala/src/library/scala/Product14.scala
-#./scala-scala/src/library/scala/Product15.scala
-#./scala-scala/src/library/scala/Product16.scala
-#./scala-scala/src/library/scala/Product17.scala
-#./scala-scala/src/library/scala/Product18.scala
-#./scala-scala/src/library/scala/Product19.scala
-#./scala-scala/src/library/scala/Product2.scala
-#./scala-scala/src/library/scala/Product20.scala
-#./scala-scala/src/library/scala/Product21.scala
-#./scala-scala/src/library/scala/Product22.scala
-#./scala-scala/src/library/scala/Product3.scala
-#./scala-scala/src/library/scala/Product4.scala
-#./scala-scala/src/library/scala/Product5.scala
-#./scala-scala/src/library/scala/Product6.scala
-#./scala-scala/src/library/scala/Product7.scala
-#./scala-scala/src/library/scala/Product8.scala
-#./scala-scala/src/library/scala/Product9.scala
+./scala-scala/src/library/scala/Product.scala
+./scala-scala/src/library/scala/Product1.scala
+./scala-scala/src/library/scala/Product10.scala
+./scala-scala/src/library/scala/Product11.scala
+./scala-scala/src/library/scala/Product12.scala
+./scala-scala/src/library/scala/Product13.scala
+./scala-scala/src/library/scala/Product14.scala
+./scala-scala/src/library/scala/Product15.scala
+./scala-scala/src/library/scala/Product16.scala
+./scala-scala/src/library/scala/Product17.scala
+./scala-scala/src/library/scala/Product18.scala
+./scala-scala/src/library/scala/Product19.scala
+./scala-scala/src/library/scala/Product2.scala
+./scala-scala/src/library/scala/Product20.scala
+./scala-scala/src/library/scala/Product21.scala
+./scala-scala/src/library/scala/Product22.scala
+./scala-scala/src/library/scala/Product3.scala
+./scala-scala/src/library/scala/Product4.scala
+./scala-scala/src/library/scala/Product5.scala
+./scala-scala/src/library/scala/Product6.scala
+./scala-scala/src/library/scala/Product7.scala
+./scala-scala/src/library/scala/Product8.scala
+./scala-scala/src/library/scala/Product9.scala
./scala-scala/src/library/scala/Proxy.scala