d/dmd: Merge upstream dmd 7423993c9
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 12 Mar 2019 13:29:16 +0000 (13:29 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Tue, 12 Mar 2019 13:29:16 +0000 (13:29 +0000)
Fixes C++ mangling for substituted basic types that are target-specific.
Introduces a new method that currently does nothing, but could in future
make use of flag_abi_version as extern(C++) integration improves in
latter versions of the D front-end.

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

gcc/d/ChangeLog:

2019-03-12  Iain Buclaw  <ibuclaw@gdcproject.org>

* d-lang.cc (d_init_options): Set global.params.cplusplus to C++14.
* d-target.cc (Target::cppFundamentalType): New method.

From-SVN: r269611

gcc/d/ChangeLog
gcc/d/d-lang.cc
gcc/d/d-target.cc
gcc/d/dmd/MERGE
gcc/d/dmd/cppmangle.c
gcc/d/dmd/globals.h
gcc/d/dmd/target.h
gcc/testsuite/gdc.test/runnable/cppa.d
gcc/testsuite/gdc.test/runnable/extra-files/cppb.cpp

index 4d9fb99a8d8d743b58a23deeb8030332c10e93e5..c91a05079b73519338531785fa71ce9e89059b95 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-12  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * d-lang.cc (d_init_options): Set global.params.cplusplus to C++14.
+       * d-target.cc (Target::cppFundamentalType): New method.
+
 2019-03-09  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        PR d/89041
index b53e56e65a27d706b86ef26f948a7a5cbb83d7bb..d97525a590e645ae097710b6595381b9816e72d6 100644 (file)
@@ -282,6 +282,9 @@ d_init_options (unsigned int, cl_decoded_option *decoded_options)
   global.params.betterC = false;
   global.params.allInst = false;
 
+  /* Default extern(C++) mangling to C++14.  */
+  global.params.cplusplus = CppStdRevisionCpp14;
+
   global.params.linkswitches = new Strings ();
   global.params.libfiles = new Strings ();
   global.params.objfiles = new Strings ();
index de57d9256dbadbb1f62e4295bc1a74f91705265c..e0cfbafe0b9e565983c6383651c4798009a52cd3 100644 (file)
@@ -385,6 +385,15 @@ Target::cppParameterType (Parameter *arg)
   return t;
 }
 
+/* Checks whether TYPE is a vendor-specific fundamental type.  Stores the result
+   in IS_FUNDAMENTAL and returns true if the parameter was set.  */
+
+bool
+Target::cppFundamentalType (const Type *, bool &)
+{
+  return false;
+}
+
 /* Return the default system linkage for the target.  */
 
 LINK
index cf5a22f070f1ae76f044f28181cf9ef7c3797ea1..f58b620d84492390cb912b3854412a83ef93ef90 100644 (file)
@@ -1,4 +1,4 @@
-fcc235e8e25f7758266f7874edd5abefb9943e0b
+7423993c996ed9f73d6ba6d58f625ad3c778ca1d
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index b991417c35e280efb7d8dc5d121336c3fb642e6e..9b24fd2c2e46d0bcd826256f71944ba6e011f2b7 100644 (file)
@@ -120,6 +120,40 @@ class CppMangleVisitor : public Visitor
                 !getQualifier(s));      // at global level
     }
 
+    /************************
+     * Determine if type is a C++ fundamental type.
+     * Params:
+     *  t = type to check
+     * Returns:
+     *  true if it is a fundamental type
+     */
+    static bool isFundamentalType(Type *t)
+    {
+        // First check the target whether some specific ABI is being followed.
+        bool isFundamental;
+        if (Target::cppFundamentalType(t, isFundamental))
+            return isFundamental;
+        if (t->ty == Tenum)
+        {
+            // Peel off enum type from special types.
+            TypeEnum *te = (TypeEnum *)t;
+            if (te->sym->isSpecial())
+                t = te->sym->getMemtype(Loc());
+        }
+
+        // Fundamental arithmetic types:
+        // 1. integral types: bool, char, int, ...
+        // 2. floating point types: float, double, real
+        // 3. void
+        // 4. null pointer: std::nullptr_t (since C++11)
+        if (t->ty == Tvoid || t->ty == Tbool)
+            return true;
+        else if (t->ty == Tnull && global.params.cplusplus >= CppStdRevisionCpp11)
+            return true;
+        else
+            return t->isTypeBasic() && (t->isintegral() || t->isreal());
+    }
+
     /******************************
      * Write the mangled representation of the template arguments.
      * Params:
@@ -741,7 +775,8 @@ public:
      */
     void writeBasicType(Type *t, char p, char c)
     {
-        if (p || t->isConst())
+        // Only do substitutions for non-fundamental types.
+        if (!isFundamentalType(t) || t->isConst())
         {
             if (substitute(t))
                 return;
@@ -767,6 +802,22 @@ public:
         if (t->isImmutable() || t->isShared())
             return error(t);
 
+        // Handle any target-specific basic types.
+        if (const char *tm = Target::cppTypeMangle(t))
+        {
+            // Only do substitutions for non-fundamental types.
+            if (!isFundamentalType(t) || t->isConst())
+            {
+                if (substitute(t))
+                    return;
+                else
+                    append(t);
+            }
+            CV_qualifiers(t);
+            buf->writestring(tm);
+            return;
+        }
+
         /* <builtin-type>:
          * v        void
          * w        wchar_t
@@ -832,17 +883,6 @@ public:
             case Tcomplex80:    p = 'C'; c = 'e';       break;
 
             default:
-                // Handle any target-specific basic types.
-                if (const char *tm = Target::cppTypeMangle(t))
-                {
-                    if (substitute(t))
-                        return;
-                    else
-                        append(t);
-                    CV_qualifiers(t);
-                    buf->writestring(tm);
-                    return;
-                }
                 return error(t);
         }
         writeBasicType(t, p, c);
index 6c37cca3236b1364935114a961ca7c9c4646292a..e2d42c7b67b8e093a166b09ac8c29ba68843825b 100644 (file)
@@ -55,6 +55,14 @@ enum CPU
     native              // the machine the compiler is being run on
 };
 
+enum CppStdRevision
+{
+    CppStdRevisionCpp98 = 199711,
+    CppStdRevisionCpp11 = 201103,
+    CppStdRevisionCpp14 = 201402,
+    CppStdRevisionCpp17 = 201703
+};
+
 // Put command line switches in here
 struct Param
 {
@@ -114,6 +122,7 @@ struct Param
     bool check10378;    // check for issues transitioning to 10738
     bool bug10378;      // use pre-bugzilla 10378 search strategy
     bool vsafe;         // use enhanced @safe checking
+    unsigned cplusplus;     // version of C++ name mangling to support
     bool showGaggedErrors;  // print gagged errors anyway
 
     CPU cpu;                // CPU instruction set to target
index 66be20144325000d9abe7ca8d5025b7d813da770..1729bc33ffa33c9a36e6fc6829336f15a4400885 100644 (file)
@@ -71,5 +71,6 @@ struct Target
     static const char *cppTypeInfoMangle(ClassDeclaration *cd);
     static const char *cppTypeMangle(Type *t);
     static Type *cppParameterType(Parameter *p);
+    static bool cppFundamentalType(const Type *t, bool& isFundamental);
     static LINK systemLinkage();
 };
index 82b93adf1f65306c6d6940af4617e2bca68ae0cd..6b2bafbe7bca64dbae464d31269dd81c6a73de92 100644 (file)
@@ -619,6 +619,7 @@ else
     alias c_long_double myld;
 
 extern (C++) myld testld(myld);
+extern (C++) myld testldld(myld, myld);
 
 
 void test15()
@@ -626,6 +627,10 @@ void test15()
     myld ld = 5.0;
     ld = testld(ld);
     assert(ld == 6.0);
+
+    myld ld2 = 5.0;
+    ld2 = testldld(ld2, ld2);
+    assert(ld2 == 6.0);
 }
 
 /****************************************/
index 7574c5fba72118c40cbb698c8caa5f961784a1f5..587145c61c30aa9ae9c1c9f9841a2c262dc70d77 100644 (file)
@@ -439,6 +439,12 @@ long double testld(long double ld)
     return ld + 1;
 }
 
+long double testldld(long double ld1, long double ld2)
+{
+    assert(ld1 == 5);
+    return ld2 + 1;
+}
+
 long testl(long lng)
 {
     assert(lng == 5);