diff dmd/attrib.c @ 527:cecfee2d01a8

Added support for overloaded intrinsics. Added atomic intrinsics in the intrinsics.di header.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 20 Aug 2008 01:02:22 +0200
parents a34078905d01
children f79bbd1d0b27
line wrap: on
line diff
--- a/dmd/attrib.c	Tue Aug 19 20:18:01 2008 +0200
+++ b/dmd/attrib.c	Wed Aug 20 01:02:22 2008 +0200
@@ -838,7 +838,7 @@
         expr = expr->semantic(sc);
         if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
         {
-             error("pragma intrinsic requires exactly 1 string literal parameter");
+             error("requires exactly 1 string literal parameter");
              fatal();
         }
         llvm_internal = LLVMintrinsic;
@@ -849,7 +849,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma no_typeinfo takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMno_typeinfo;
@@ -860,7 +860,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma no_moduleinfo takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMno_moduleinfo;
@@ -871,7 +871,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma alloca takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMalloca;
@@ -882,7 +882,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma va_start takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMva_start;
@@ -893,7 +893,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma va_copy takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMva_copy;
@@ -904,7 +904,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma va_end takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMva_end;
@@ -915,7 +915,7 @@
     {
         if (args && args->dim > 0)
         {
-             error("pragma va_arg takes no parameters");
+             error("takes no parameters");
              fatal();
         }
         llvm_internal = LLVMva_arg;
@@ -928,7 +928,7 @@
         expr = expr->semantic(sc);
         if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
         {
-             error("pragma llvmdc requires exactly 1 string literal parameter");
+             error("requires exactly 1 string literal parameter");
              fatal();
         }
         else if (arg1str == "verbose")
@@ -937,7 +937,7 @@
         }
         else
         {
-            error("pragma llvmdc command '%s' invalid");
+            error("command '%s' invalid");
             fatal();
         }
     }
@@ -1000,9 +1000,14 @@
                 fd->llvmInternal = llvm_internal;
                 fd->intrinsicName = arg1str;
             }
+            else if (TemplateDeclaration* td = s->isTemplateDeclaration())
+            {
+                td->llvmInternal = llvm_internal;
+                td->intrinsicName = arg1str;
+            }
             else
             {
-                error("the intrinsic pragma is only allowed on function declarations");
+                error("only allowed on function declarations");
                 fatal();
             }
             break;