Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
6977 Discussions

Potential error in examples/cblas/common_func.c

Bartosz_W_
Beginner
413 Views

When compiling CBLAS examples on Intel64 I get a number of related warnings, which indicate a benign error present in the example code:

common_func.c(863): warning #810: conversion from "CBLAS_LAYOUT={enum <unnamed>} *" to "int" may lose significant bits
             if ( (int)layout == CblasRowMajor )
                  ^

common_func.c(865): warning #810: conversion from "CBLAS_LAYOUT={enum <unnamed>} *" to "int" may lose significant bits
             else if ( (int)layout == CblasColMajor )
                       ^

common_func.c(869): warning #810: conversion from "CBLAS_SIDE={enum <unnamed>} *" to "int" may lose significant bits
              if ( (int)side == CblasLeft )
                   ^

common_func.c(871): warning #810: conversion from "CBLAS_SIDE={enum <unnamed>} *" to "int" may lose significant bits
              else if ( (int)side == CblasRight )
                        ^

common_func.c(875): warning #810: conversion from "CBLAS_UPLO={enum <unnamed>} *" to "int" may lose significant bits
              if ( (int)uplo == CblasUpper )
                   ^

common_func.c(877): warning #810: conversion from "CBLAS_UPLO={enum <unnamed>} *" to "int" may lose significant bits
             else if ( (int)uplo == CblasLower )
                       ^

common_func.c(881): warning #810: conversion from "CBLAS_DIAG={enum <unnamed>} *" to "int" may lose significant bits
              if ( (int)diag == CblasUnit )
                   ^

common_func.c(883): warning #810: conversion from "CBLAS_DIAG={enum <unnamed>} *" to "int" may lose significant bits
              else if ( (int)diag == CblasNonUnit )
                        ^

common_func.c(889): warning #810: conversion from "CBLAS_TRANSPOSE={enum <unnamed>} *" to "int" may lose significant bits
              if ( (int)trans == CblasNoTrans )
                   ^

common_func.c(891): warning #810: conversion from "CBLAS_TRANSPOSE={enum <unnamed>} *" to "int" may lose significant bits
              else if ( (int)trans == CblasTrans )
                        ^

common_func.c(893): warning #810: conversion from "CBLAS_TRANSPOSE={enum <unnamed>} *" to "int" may lose significant bits
              else if ( (int)trans == CblasConjTrans )

It seems that the compiler is right to complain - the PrintParameters function errorneously declares some variables as pointers, when in fact they should be plain enums. This works, but the code is in error - variables are declared as pointers, but are used as plain enums for comparison, and those pointers are not dereferenced anywhere.

With that in mind, for next release it should probably be patched as:

--- common_func.c       2014-09-07 21:52:49.615764023 +0200
+++ common_func.c       2014-09-07 22:42:58.929931820 +0200
@@ -833,11 +833,11 @@

 void PrintParameters( char *names, ... )
 {
-    CBLAS_LAYOUT    *layout;
-    CBLAS_SIDE      *side;
-    CBLAS_UPLO      *uplo;
-    CBLAS_DIAG      *diag;
-    CBLAS_TRANSPOSE *trans;
+    CBLAS_LAYOUT     layout;
+    CBLAS_SIDE       side;
+    CBLAS_UPLO       uplo;
+    CBLAS_DIAG       diag;
+    CBLAS_TRANSPOSE  trans;
     char            *p, *str, str1[MAX_STRING_LEN], buf[MAX_STRING_LEN];
     va_list          ap;
     char             seps[]=" ,";
@@ -859,38 +859,38 @@
           p++;
        }
        if ( strcmp( str1, "layout" ) == 0 ) {
-           layout = va_arg( ap, CBLAS_LAYOUT* );
-           if ( (int)layout == CblasRowMajor )
+           layout = va_arg( ap, CBLAS_LAYOUT );
+           if ( layout == CblasRowMajor )
                 printf("LAYOUT = CblasRowMajor  ");
-           else if ( (int)layout == CblasColMajor )
+           else if ( layout == CblasColMajor )
                 printf("LAYOUT = CblasColMajor  ");
        } else if ( strcmp( str1, "side" ) == 0 ) {
-            side = va_arg( ap, CBLAS_SIDE * );
-            if ( (int)side == CblasLeft )
+            side = va_arg( ap, CBLAS_SIDE );
+            if ( side == CblasLeft )
                printf("SIDE = CblasLeft  ");
-            else if ( (int)side == CblasRight )
+            else if ( side == CblasRight )
                printf("SIDE = CblasRight  ");
        } else if ( strcmp( str1, "uplo" ) == 0 ) {
-            uplo = va_arg( ap, CBLAS_UPLO * );
-            if ( (int)uplo == CblasUpper )
+            uplo = va_arg( ap, CBLAS_UPLO );
+            if ( uplo == CblasUpper )
                printf("UPLO = CblasUpper  ");
-           else if ( (int)uplo == CblasLower )
+           else if ( uplo == CblasLower )
                printf("UPLO = CblasLower  ");
        } else if ( strcmp( str1, "diag" ) == 0 ) {
-            diag = va_arg( ap, CBLAS_DIAG * );
-            if ( (int)diag == CblasUnit )
+            diag = va_arg( ap, CBLAS_DIAG );
+            if ( diag == CblasUnit )
                printf("DIAG=CblasUnit  ");
-            else if ( (int)diag == CblasNonUnit )
+            else if ( diag == CblasNonUnit )
                printf("DIAG = CblasNonUnit  ");
        } else if ( ( strcmp( str1, "trans"  ) == 0 ) ||
                    ( strcmp( str1, "transa" ) == 0 ) ||
                    ( strcmp( str1, "transb" ) == 0 ) ) {
-            trans = va_arg( ap, CBLAS_TRANSPOSE * );
-            if ( (int)trans == CblasNoTrans )
+            trans = va_arg( ap, CBLAS_TRANSPOSE );
+            if ( trans == CblasNoTrans )
                printf("%s = CblasNoTrans  ", str);
-            else if ( (int)trans == CblasTrans )
+            else if ( trans == CblasTrans )
                printf("%s = CblasTrans  ", str);
-            else if ( (int)trans == CblasConjTrans )
+            else if ( trans == CblasConjTrans )
                printf("%s = CblasConjTrans  ", str);
        }
     } while ( (str = strtok( NULL, seps )) != NULL );

 

0 Kudos
1 Reply
Ying_H_Intel
Employee
413 Views

Hi Bartosz

Thank you a lot for the reporting.  I will ask our build team to investigate and fix them if possible. 

It is true that there are the warnings.  And for someone who don't want to see them,  please use -w option to suppress.  

Thanks

Ying 

0 Kudos
Reply